Author: nfrmtk
Date: 2025-09-01T13:49:31Z
New Revision: 78e3a58d218c07bf54b466718bbc53547648040a

URL: 
https://github.com/llvm/llvm-project/commit/78e3a58d218c07bf54b466718bbc53547648040a
DIFF: 
https://github.com/llvm/llvm-project/commit/78e3a58d218c07bf54b466718bbc53547648040a.diff

LOG: [Clang] correct error message when assigning to const reference captured 
in lambda (#105647)

Fixes #98772

Added: 
    

Modified: 
    clang/docs/ReleaseNotes.rst
    clang/lib/Sema/SemaExpr.cpp
    clang/test/SemaCXX/lambda-expressions.cpp

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 4ad562f2579c6..046e6a51a1ebd 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -246,6 +246,8 @@ Improvements to Clang's diagnostics
   potential misaligned members get processed before they can get discarded.
   (#GH144729)
 
+- Clang now emits dignostic with correct message in case of assigning to const 
reference captured in lambda. (#GH105647)
+
 - Fixed false positive in ``-Wmissing-noreturn`` diagnostic when it was 
requiring the usage of
   ``[[noreturn]]`` on lambdas before C++23 (#GH154493).
 

diff  --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index d383544e54329..8565b18078185 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -13620,6 +13620,8 @@ static NonConstCaptureKind 
isReferenceToNonConstCapture(Sema &S, Expr *E) {
   VarDecl *Var = dyn_cast<VarDecl>(Value);
   if (!Var)
     return NCCK_None;
+  if (Var->getType()->isReferenceType())
+    return NCCK_None;
 
   assert(Var->hasLocalStorage() && "capture added 'const' to non-local?");
 

diff  --git a/clang/test/SemaCXX/lambda-expressions.cpp 
b/clang/test/SemaCXX/lambda-expressions.cpp
index 2d2dde82a28e6..8ea8e324cf5d2 100644
--- a/clang/test/SemaCXX/lambda-expressions.cpp
+++ b/clang/test/SemaCXX/lambda-expressions.cpp
@@ -194,6 +194,11 @@ namespace ModifyingCapture {
     [=] {
       n = 1; // expected-error {{cannot assign to a variable captured by copy 
in a non-mutable lambda}}
     };
+    const int cn = 0;
+    // cxx03-cxx11-warning@+1 {{initialized lambda captures are a C++14 
extension}}
+    [&cnr = cn]{ // expected-note {{variable 'cnr' declared const here}}
+      cnr = 1; // expected-error {{cannot assign to variable 'cnr' with 
const-qualified type 'const int &'}}
+    };
   }
 }
 


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to