diff options
| author | Douglas Gregor <dgregor@apple.com> | 2013-04-08 18:40:13 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2013-04-08 18:40:13 +0000 |
| commit | f7106af65693d564632956203c879622b2ec8a1f (patch) | |
| tree | 0c888f2886ee352c6fe4b37b787f5d44e4cfd8a5 | |
| parent | aa3ffafbde462b1e8ac5c666c8822e738418c195 (diff) | |
| download | bcm5719-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.h | 14 | ||||
| -rw-r--r-- | clang/test/SemaObjCXX/foreach.mm | 8 |
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 |

