From: Fariborz Jahanian Date: Sun, 29 Aug 2010 17:20:53 +0000 (+0000) Subject: ObjClang++: Allow declaration of block variable in a collection X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f459beb2fa7c5441eae4b1f5311f6a2ea60f6b00;p=clang ObjClang++: Allow declaration of block variable in a collection statement header (fixes radar 8295106). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112443 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseTentative.cpp b/lib/Parse/ParseTentative.cpp index dcf1d40628..17273a0cf6 100644 --- a/lib/Parse/ParseTentative.cpp +++ b/lib/Parse/ParseTentative.cpp @@ -188,7 +188,7 @@ Parser::TPResult Parser::TryParseInitDeclaratorList() { ConsumeParen(); if (!SkipUntil(tok::r_paren)) return TPResult::Error(); - } else if (Tok.is(tok::equal)) { + } else if (Tok.is(tok::equal) || isTokIdentifier_in()) { // MSVC and g++ won't examine the rest of declarators if '=' is // encountered; they just conclude that we have a declaration. // EDG parses the initializer completely, which is the proper behavior @@ -197,6 +197,12 @@ Parser::TPResult Parser::TryParseInitDeclaratorList() { // At present, Clang follows MSVC and g++, since the parser does not have // the ability to parse an expression fully without recording the // results of that parse. + // Also allow 'in' after on objective-c declaration as in: + // for (int (^b)(void) in array). Ideally this should be done in the + // context of parsing for-init-statement of a foreach statement only. But, + // in any other context 'in' is invalid after a declaration and parser + // issues the error regardless of outcome of this decision. + // FIXME. Change if above assumption does not hold. return TPResult::True(); } diff --git a/test/SemaObjCXX/foreach-block.mm b/test/SemaObjCXX/foreach-block.mm new file mode 100644 index 0000000000..91bd0c83b3 --- /dev/null +++ b/test/SemaObjCXX/foreach-block.mm @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -fblocks %s +// rdar://8295106 + +int main() { +id array; + + for (int (^b)(void) in array) { + if (b() == 10000) { + return 1; + } + } + + int (^b)(void) in array; // expected-error {{expected ';' at end of declaration}} +}