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

Reply via email to