]> granicus.if.org Git - clang/commitdiff
Reenable 'break' in 'for' specifier to allow compilation of QT macro 'foreach'
authorSerge Pavlov <sepavloff@gmail.com>
Tue, 22 Oct 2013 17:14:47 +0000 (17:14 +0000)
committerSerge Pavlov <sepavloff@gmail.com>
Tue, 22 Oct 2013 17:14:47 +0000 (17:14 +0000)
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

lib/Parse/ParseStmt.cpp
test/Parser/bad-control.c

index 395fb394dc49716d3e70a6cc3ec2b41a389ce79c..fe884148ebee51b49120d8703b445c4189b40cc9 100644 (file)
@@ -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.
index dc0ce11ce59c3a48fb3edad6b37c4237fc499df1..9560af325953451b176486f0e0e90b62e3e66a2b 100644 (file)
@@ -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;
   }
 }