diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -267,7 +267,7 @@ the compilation of the foreign language sources (e.g. Swift). - The ``__has_attribute``, ``__has_c_attribute`` and ``__has_cpp_attribute`` preprocessor operators now return 1 also for attributes defined by plugins. -- Improve the AST fidelity of ``alignas`` and ``_Alignas`` attribute. Before, we +- Improve the AST fidelity of ``alignas`` and ``_Alignas`` attribute. Before, we model ``alignas(type-id)`` as though the user wrote ``alignas(alignof(type-id))``, now we directly use ``alignas(type-id)``. @@ -321,7 +321,7 @@ (`#62850: `_). - Clang now warns when any predefined macro is undefined or redefined, instead of only some of them. -- Clang now correctly diagnoses when the argument to ``alignas`` or ``_Alignas`` +- Clang now correctly diagnoses when the argument to ``alignas`` or ``_Alignas`` is an incomplete type. (`#55175: `_, and fixes an incorrect mention of ``alignof`` in a diagnostic about ``alignas``). @@ -478,6 +478,9 @@ (`#63008 `_). - Reject increment of bool value in unevaluated contexts after C++17. (`#47517 `_). +- 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 @@ -2140,8 +2140,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 @@ -2202,9 +2202,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}} }