diff options
-rw-r--r-- | lib/Parse/ParseStmt.cpp | 8 | ||||
-rw-r--r-- | test/SemaObjC/foreach-1.m | 20 |
2 files changed, 18 insertions, 10 deletions
diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp index b87ede9388..fa712e0a9e 100644 --- a/lib/Parse/ParseStmt.cpp +++ b/lib/Parse/ParseStmt.cpp @@ -867,7 +867,7 @@ Parser::OwningStmtResult Parser::ParseForStatement() { return StmtError(); } - bool C99orCXX = getLang().C99 || getLang().CPlusPlus; + bool C99orCXXorObjC = getLang().C99 || getLang().CPlusPlus || getLang().ObjC1; // C99 6.8.5p5 - In C99, the for statement is a block. This is not // the case for C90. Start the loop scope. @@ -885,7 +885,7 @@ Parser::OwningStmtResult Parser::ParseForStatement() { // as those declared in the condition. // unsigned ScopeFlags; - if (C99orCXX) + if (C99orCXXorObjC) ScopeFlags = Scope::BreakScope | Scope::ContinueScope | Scope::DeclScope | Scope::ControlScope; else @@ -906,7 +906,7 @@ Parser::OwningStmtResult Parser::ParseForStatement() { ConsumeToken(); } else if (isSimpleDeclaration()) { // for (int X = 4; // Parse declaration, which eats the ';'. - if (!C99orCXX) // Use of C99-style for loops in C90 mode? + if (!C99orCXXorObjC) // Use of C99-style for loops in C90 mode? Diag(Tok, diag::ext_c99_variable_decl_in_for_loop); SourceLocation DeclStart = Tok.getLocation(), DeclEnd; @@ -976,7 +976,7 @@ Parser::OwningStmtResult Parser::ParseForStatement() { // for-init-statement/condition and a new scope for substatement in C++. // ParseScope InnerScope(this, Scope::DeclScope, - C99orCXX && Tok.isNot(tok::l_brace)); + C99orCXXorObjC && Tok.isNot(tok::l_brace)); // Read the body statement. OwningStmtResult Body(ParseStatement()); diff --git a/test/SemaObjC/foreach-1.m b/test/SemaObjC/foreach-1.m index d3ca424a04..f136adfa36 100644 --- a/test/SemaObjC/foreach-1.m +++ b/test/SemaObjC/foreach-1.m @@ -1,10 +1,18 @@ -// RUN: clang-cc -fsyntax-only -verify %s +/* RUN: clang-cc -fsyntax-only -verify -std=c89 -pedantic %s + */ @class NSArray; -void f(NSArray *a) -{ - for (int i in a); // expected-error{{selector element type 'int' is not a valid object}} - for ((id)2 in a); // expected-error{{selector element is not a valid lvalue}} - for (2 in a); // expected-error{{selector element is not a valid lvalue}} +void f(NSArray *a) { + id keys; + for (int i in a); /* expected-error{{selector element type 'int' is not a valid object}} */ + for ((id)2 in a); /* expected-error{{selector element is not a valid lvalue}} */ + for (2 in a); /* expected-error{{selector element is not a valid lvalue}} */ + + /* This should be ok, 'thisKey' should be scoped to the loop in question, + * and no diagnostics even in pedantic mode should happen. + * rdar://6814674 + */ + for (id thisKey in keys); + for (id thisKey in keys); } |