r193170 - Reenable 'break' in 'for' specifier to allow compilation of QT macro 'foreach'

Serge Pavlov sepavloff at gmail.com
Tue Oct 22 10:14:48 PDT 2013


Author: sepavloff
Date: Tue Oct 22 12:14:47 2013
New Revision: 193170

URL: http://llvm.org/viewvc/llvm-project?rev=193170&view=rev
Log:
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.

Modified:
    cfe/trunk/lib/Parse/ParseStmt.cpp
    cfe/trunk/test/Parser/bad-control.c

Modified: cfe/trunk/lib/Parse/ParseStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseStmt.cpp?rev=193170&r1=193169&r2=193170&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseStmt.cpp (original)
+++ cfe/trunk/lib/Parse/ParseStmt.cpp Tue Oct 22 12:14:47 2013
@@ -1553,6 +1553,10 @@ StmtResult Parser::ParseForStatement(Sou
 
     // 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.

Modified: cfe/trunk/test/Parser/bad-control.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/bad-control.c?rev=193170&r1=193169&r2=193170&view=diff
==============================================================================
--- cfe/trunk/test/Parser/bad-control.c (original)
+++ cfe/trunk/test/Parser/bad-control.c Tue Oct 22 12:14:47 2013
@@ -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;
   }
 }





More information about the cfe-commits mailing list