summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2013-04-08 18:40:13 +0000
committerDouglas Gregor <dgregor@apple.com>2013-04-08 18:40:13 +0000
commitf7106af65693d564632956203c879622b2ec8a1f (patch)
tree0c888f2886ee352c6fe4b37b787f5d44e4cfd8a5
parentaa3ffafbde462b1e8ac5c666c8822e738418c195 (diff)
downloadbcm5719-llvm-f7106af65693d564632956203c879622b2ec8a1f.tar.gz
bcm5719-llvm-f7106af65693d564632956203c879622b2ec8a1f.zip
<rdar://problem/13540921> Cope with instantiations of the C++11 range-based for loop that end up being Objective-C fast enumeration loops.
llvm-svn: 179037
-rw-r--r--clang/lib/Sema/TreeTransform.h14
-rw-r--r--clang/test/SemaObjCXX/foreach.mm8
2 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index bdd68a7bde9..f68de26cde3 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -1338,6 +1338,20 @@ public:
Expr *Cond, Expr *Inc,
Stmt *LoopVar,
SourceLocation RParenLoc) {
+ // If we've just learned that the range is actually an Objective-C
+ // collection, treat this as an Objective-C fast enumeration loop.
+ if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
+ if (RangeStmt->isSingleDecl()) {
+ if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
+ Expr *RangeExpr = RangeVar->getInit();
+ if (!RangeExpr->isTypeDependent() &&
+ RangeExpr->getType()->isObjCObjectPointerType())
+ return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr,
+ RParenLoc);
+ }
+ }
+ }
+
return getSema().BuildCXXForRangeStmt(ForLoc, ColonLoc, Range, BeginEnd,
Cond, Inc, LoopVar, RParenLoc,
Sema::BFRK_Rebuild);
diff --git a/clang/test/SemaObjCXX/foreach.mm b/clang/test/SemaObjCXX/foreach.mm
index ec6ed0550e2..ac787bd09ed 100644
--- a/clang/test/SemaObjCXX/foreach.mm
+++ b/clang/test/SemaObjCXX/foreach.mm
@@ -16,6 +16,14 @@ void f(NSArray *a) {
for (auto thisKey : keys) { } // expected-warning{{'auto' deduced as 'id' in declaration of 'thisKey'}}
}
+template<typename Collection>
+void ft(Collection col) {
+ for (id x : col) { }
+ for (auto x : col) { }
+}
+
+template void ft(NSArray *);
+
/* // rdar://9072298 */
@protocol NSObject @end
OpenPOWER on IntegriCloud