Author: Corentin Jabot Date: 2025-07-10T14:06:02+02:00 New Revision: 78e84e5779f4ed1de9bc29b6aae8609de2b9f8c4
URL: https://github.com/llvm/llvm-project/commit/78e84e5779f4ed1de9bc29b6aae8609de2b9f8c4 DIFF: https://github.com/llvm/llvm-project/commit/78e84e5779f4ed1de9bc29b6aae8609de2b9f8c4.diff LOG: [Clang] A lone `[` does not an attribute make (#147306) In some tentative parses, we would always consider `[` as the start of an attribute - only `[[` should be. Fixes #63880 Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/Parse/ParseTentative.cpp clang/test/Parser/cxx0x-lambda-expressions.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 9048d7701e255..ca00a80d10eca 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -932,6 +932,7 @@ Bug Fixes to C++ Support through its address (``(&Foo::bar<baz>)()``). - Correctly handle allocations in the condition of a ``if constexpr``.(#GH120197) (#GH134820) - Fixed a crash when handling invalid member using-declaration in C++20+ mode. (#GH63254) +- Fixed parsing of lambda expressions that appear after ``*`` or ``&`` in contexts where a declaration can appear. (#GH63880) - Fix name lookup in lambda appearing in the body of a requires expression. (#GH147650) - Fix a crash when trying to instantiate an ambiguous specialization. (#GH51866) - Improved handling of variables with ``consteval`` constructors, to diff --git a/clang/lib/Parse/ParseTentative.cpp b/clang/lib/Parse/ParseTentative.cpp index 95cee824c40b7..b58100c635677 100644 --- a/clang/lib/Parse/ParseTentative.cpp +++ b/clang/lib/Parse/ParseTentative.cpp @@ -735,10 +735,12 @@ bool Parser::TrySkipAttributes() { tok::kw_alignas) || Tok.isRegularKeywordAttribute()) { if (Tok.is(tok::l_square)) { + if (!NextToken().is(tok::l_square)) + return true; + ConsumeBracket(); - if (Tok.isNot(tok::l_square)) - return false; ConsumeBracket(); + if (!SkipUntil(tok::r_square) || Tok.isNot(tok::r_square)) return false; // Note that explicitly checking for `[[` and `]]` allows to fail as diff --git a/clang/test/Parser/cxx0x-lambda-expressions.cpp b/clang/test/Parser/cxx0x-lambda-expressions.cpp index a786a964163e4..f90f8ce27c53e 100644 --- a/clang/test/Parser/cxx0x-lambda-expressions.cpp +++ b/clang/test/Parser/cxx0x-lambda-expressions.cpp @@ -159,3 +159,15 @@ struct U { template <typename T> void m_fn1(T x = 0[0); // expected-error{{expected ']'}} expected-note{{to match this '['}} } *U; + + + +namespace GH63880{ +void f() { + char* i(*[] { return new int; }()); + // expected-error@-1{{cannot initialize a variable of type 'char *' with an lvalue of type 'int'}} + + char* j(&[]() -> int& { return *new int; }()); + //expected-error@-1{{cannot initialize a variable of type 'char *' with an rvalue of type 'int *'}} +} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits