The following example copied from the C++17 draft [N4582] fails to compile: ---------------------------------------- void f3() { float x, &r = x; [=] { // x and r are not captured (appearance in a decltype operand is not an odr-use) decltype(x) y1; // y1 has type float decltype((x)) y2 = y1; // y2 has type float const& because this lambda // is not mutable and x is an lvalue decltype(r) r1 = y1; // r1 has type float& (transformation not considered) decltype((r)) r2 = y2; // r2 has type float const& }; } ---------------------------------------- E:\Desktop>g++ -pedantic -pedantic-errors -std=c++14 test.cpp test.cpp: In lambda function: test.cpp:8:22: error: binding 'const float' to reference of type 'float&' discards qualifiers decltype((r)) r2 = y2; // r2 has type float const& ^~
*** Bug 93386 has been marked as a duplicate of this bug. ***
Quoting Jason M.: "looks like more of an issue with how is_lambda_ignored_entity skips captures in unevaluated context."
*** Bug 96095 has been marked as a duplicate of this bug. ***
The master branch has been updated by Patrick Palka <ppalka@gcc.gnu.org>: https://gcc.gnu.org/g:0410b754e56c0868203c2412e0585ba070ea938d commit r14-5331-g0410b754e56c0868203c2412e0585ba070ea938d Author: Patrick Palka <ppalka@redhat.com> Date: Fri Nov 10 10:58:06 2023 -0500 c++: decltype of (by-value captured reference) [PR79620] The capture_decltype handling in finish_decltype_type wasn't looking through implicit INDIRECT_REF (added by convert_from_reference), which caused us to incorrectly resolve decltype((r)) to float& below. This patch fixes this, and adds an assert to outer_automatic_var_p to help prevent against such bugs. We still don't fully accept the example ultimately because for the decltype inside the lambda's trailing return type, at that point we're in lambda type scope but not yet in lambda function scope that the capture_decltype handling looks for (which is an orthogonal bug). PR c++/79620 gcc/cp/ChangeLog: * cp-tree.h (STRIP_REFERENCE_REF): Define. * semantics.cc (outer_var_p): Assert REFERENCE_REF_P is false. (finish_decltype_type): Look through implicit INDIRECT_REF when deciding whether to call capture_decltype. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/lambda/lambda-decltype3.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com>
Fixed for GCC 14.
*** Bug 63192 has been marked as a duplicate of this bug. ***