summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Parse/ParseStmt.cpp4
-rw-r--r--clang/test/Parser/bad-control.c18
2 files changed, 17 insertions, 5 deletions
diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp
index 395fb394dc4..fe884148ebe 100644
--- a/clang/lib/Parse/ParseStmt.cpp
+++ b/clang/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/clang/test/Parser/bad-control.c b/clang/test/Parser/bad-control.c
index dc0ce11ce59..9560af32595 100644
--- a/clang/test/Parser/bad-control.c
+++ b/clang/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;
}
}
OpenPOWER on IntegriCloud