From: John McCall Date: Fri, 30 Mar 2012 05:43:39 +0000 (+0000) Subject: Handle placeholder expressions in an ObjC for-collection loop. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=29bbd1a33edfd3c81c35d5076530c2867a05bddc;p=clang Handle placeholder expressions in an ObjC for-collection loop. The way we handle this implicitly removes the ability to use property l-values in this position, but that's really okay. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@153729 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index 39e8a1a1b9..97c8eb04e9 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -1079,10 +1079,18 @@ Sema::ActOnForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, /// x can be an arbitrary l-value expression. Bind it up as a /// full-expression. StmtResult Sema::ActOnForEachLValueExpr(Expr *E) { + // Reduce placeholder expressions here. Note that this rejects the + // use of pseudo-object l-values in this position. + ExprResult result = CheckPlaceholderExpr(E); + if (result.isInvalid()) return StmtError(); + E = result.take(); + CheckImplicitConversions(E); - ExprResult Result = MaybeCreateExprWithCleanups(E); - if (Result.isInvalid()) return StmtError(); - return Owned(static_cast(Result.get())); + + result = MaybeCreateExprWithCleanups(E); + if (result.isInvalid()) return StmtError(); + + return Owned(static_cast(result.take())); } ExprResult diff --git a/test/SemaObjC/foreach.m b/test/SemaObjC/foreach.m index c865374e61..d0e0f7b9e2 100644 --- a/test/SemaObjC/foreach.m +++ b/test/SemaObjC/foreach.m @@ -46,3 +46,12 @@ int main () return 0; } +/* rdar://problem/11068137 */ +@interface Test2 +@property (assign) id prop; +@end +void test2(NSObject *collection) { + Test2 *obj; + for (obj.prop in collection) { /* expected-error {{selector element is not a valid lvalue}} */ + } +}