diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -455,6 +455,9 @@ - Fix crash when diagnosing default comparison method. (`#62791 `_) and (`#62102 `_). +- Fix assertion and quality of diagnostic messages in a for loop + containing multiple declarations and a range specifier + (`#63010 `_). Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Parse/ParseExprCXX.cpp b/clang/lib/Parse/ParseExprCXX.cpp --- a/clang/lib/Parse/ParseExprCXX.cpp +++ b/clang/lib/Parse/ParseExprCXX.cpp @@ -2138,8 +2138,6 @@ DeclGroupPtrTy DG = ParseSimpleDeclaration( DeclaratorContext::ForInit, DeclEnd, attrs, DeclSpecAttrs, false, FRI); FRI->LoopVar = Actions.ActOnDeclStmt(DG, DeclStart, Tok.getLocation()); - assert((FRI->ColonLoc.isValid() || !DG) && - "cannot find for range declaration"); return Sema::ConditionResult(); } diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp --- a/clang/lib/Parse/ParseStmt.cpp +++ b/clang/lib/Parse/ParseStmt.cpp @@ -2197,9 +2197,7 @@ if (Tok.isNot(tok::semi)) { if (!SecondPart.isInvalid()) Diag(Tok, diag::err_expected_semi_for); - else - // Skip until semicolon or rparen, don't consume it. - SkipUntil(tok::r_paren, StopAtSemi | StopBeforeMatch); + SkipUntil(tok::r_paren, StopAtSemi | StopBeforeMatch); } if (Tok.is(tok::semi)) { diff --git a/clang/test/Parser/cxx0x-for-range.cpp b/clang/test/Parser/cxx0x-for-range.cpp --- a/clang/test/Parser/cxx0x-for-range.cpp +++ b/clang/test/Parser/cxx0x-for-range.cpp @@ -60,3 +60,22 @@ } } } + +namespace GH63010 { +void foo(int n) { + int a[] = {1, 2, 3, 4, 5}; + { + for (auto x = n ? 1 : 2 : a); // expected-error {{expected ';' in 'for' statement specifier}} \ + // expected-error {{expected expression}} + for (int i = 1; auto x = n ? 1 : 2 : a); // expected-error {{expected ';' in 'for' statement specifier}} + } + { + for (auto x = n ? 1 : 2 : a) // expected-error {{expected ';' in 'for' statement specifier}} \ + // expected-error {{expected expression}} + + } // expected-error {{expected statement}} + { + for (int i = 1; auto x = n ? 1 : 2 : a) // expected-error {{expected ';' in 'for' statement specifier}} + } // expected-error {{expected statement}} +} +} diff --git a/clang/test/Parser/objc-foreach-syntax.m b/clang/test/Parser/objc-foreach-syntax.m --- a/clang/test/Parser/objc-foreach-syntax.m +++ b/clang/test/Parser/objc-foreach-syntax.m @@ -21,8 +21,6 @@ static int test7(id keys) { - // FIXME: would be nice to suppress the secondary diagnostics. for (id key; in keys) ; // expected-error {{use of undeclared identifier 'in'}} \ - // expected-error {{expected ';' in 'for' statement specifier}} \ - // expected-warning {{expression result unused}} + // expected-error {{expected ';' in 'for' statement specifier}} }