From: Serge Pavlov Date: Tue, 22 Oct 2013 17:14:47 +0000 (+0000) Subject: Reenable 'break' in 'for' specifier to allow compilation of QT macro 'foreach' X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=37acb250dbcf580393c9936c1e71552f84220398;p=clang Reenable 'break' in 'for' specifier to allow compilation of QT macro 'foreach' This is a fix to PR17649, caused by fix in r193073. QT uses 'break' statement to implement their 'foreach' macro. To enable build of QT, this fix reenables break but only in 'for' statement specifier and only in the third expression. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193170 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp index 395fb394dc..fe884148eb 100644 --- a/lib/Parse/ParseStmt.cpp +++ b/lib/Parse/ParseStmt.cpp @@ -1553,6 +1553,10 @@ StmtResult Parser::ParseForStatement(SourceLocation *TrailingElseLoc) { // Parse the third part of the for specifier. if (Tok.isNot(tok::r_paren)) { // for (...;...;) + // This is needed to compile QT 4.8.4, which uses statement + // expression with 'break' in it. + ForScope.SetFlags(Scope::BreakScope); + ExprResult Third = ParseExpression(); // FIXME: The C++11 standard doesn't actually say that this is a // discarded-value expression, but it clearly should be. diff --git a/test/Parser/bad-control.c b/test/Parser/bad-control.c index dc0ce11ce5..9560af3259 100644 --- a/test/Parser/bad-control.c +++ b/test/Parser/bad-control.c @@ -52,14 +52,15 @@ int pr8880_6 (int a) { void pr8880_7() { for (int i = 0 ; i != 10 ; i++ ) { - for ( ; ; ({ ++i; break; })) { // expected-error {{'break' statement not in loop or switch statement}} + for ( ; ; ({ ++i; continue; })) { // expected-error {{'continue' statement not in loop statement}} } } } -void pr8880_8() { +// Have to allow 'break' in the third part of 'for' specifier to enable compilation of QT 4.8 macro 'foreach' +void pr17649() { for (int i = 0 ; i != 10 ; i++ ) - for ( ; ; ({ ++i; break; })) { // expected-error {{'break' statement not in loop or switch statement}} + for ( ; ; ({ ++i; break; })) { } } @@ -86,8 +87,15 @@ void pr8880_11() { // Moved from Analysis/dead-stores.c void rdar8014335() { - for (int i = 0 ; i != 10 ; ({ break; })) { // expected-error {{'break' statement not in loop or switch statement}} - for ( ; ; ({ ++i; break; })) ; // expected-error {{'break' statement not in loop or switch statement}} + for (int i = 0 ; i != 10 ; ({ break; })) { + for ( ; ; ({ ++i; break; })) ; + i = i * 3; + } +} + +void pr17649_2() { + for (int i = 0 ; i != 10 ; ({ continue; })) { // expected-error {{'continue' statement not in loop statement}} + for ( ; ; ({ ++i; continue; })) ; // expected-error {{'continue' statement not in loop statement}} i = i * 3; } }