From 092579833aa4738a12eb1ba6dca87a33fb295864 Mon Sep 17 00:00:00 2001 From: nfrmtk Date: Wed, 20 Aug 2025 01:17:11 +0300 Subject: [PATCH 1/2] [Clang] correct error message when assigning to const reference captured in lambda --- clang/lib/Sema/SemaExpr.cpp | 2 ++ clang/test/SemaCXX/lambda-expressions.cpp | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 265cd799373a5..2062436bf3157 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -13521,6 +13521,8 @@ static NonConstCaptureKind isReferenceToNonConstCapture(Sema &S, Expr *E) { VarDecl *Var = dyn_cast(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 &'}} + }; } } From af4a682236a40fb75f577dbddfa48760d5d48eb8 Mon Sep 17 00:00:00 2001 From: nfrmtk Date: Wed, 20 Aug 2025 01:30:57 +0300 Subject: [PATCH 2/2] add record to ReleaseNotes.rst --- clang/docs/ReleaseNotes.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 7f76f87ce6be0..d2c0965c6d7d2 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -184,6 +184,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) + Improvements to Clang's time-trace ----------------------------------