From: Jason Merrill Date: Mon, 1 Jun 2020 21:58:57 +0000 (-0400) Subject: c++: *this capture in const member fn [PR95193]. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4b68cb38ddca37a14a6f2f43de3a6d396ee1bc79;p=gcc.git c++: *this capture in const member fn [PR95193]. Here, the capture proxy for *this is const, but its DECL_VALUE_EXPR is not. Don't ICE on this; it's a reasonable difference, since in C++ an rvalue of scalar type does not have cv-qualifiers. gcc/cp/ChangeLog: PR c++/95193 * pt.c (tsubst_decl): Relax assert. gcc/testsuite/ChangeLog: PR c++/95193 * g++.dg/cpp1z/lambda-this7.C: New test. --- diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 907ca879c73..9c03c5a5bbd 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -14633,7 +14633,8 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) && DECL_BIT_FIELD_TYPE (TREE_OPERAND (ve, 1)) == type) type = TREE_TYPE (ve); else - gcc_checking_assert (TREE_TYPE (ve) == type); + gcc_checking_assert (TYPE_MAIN_VARIANT (TREE_TYPE (ve)) + == TYPE_MAIN_VARIANT (type)); SET_DECL_VALUE_EXPR (r, ve); } if (CP_DECL_THREAD_LOCAL_P (r) diff --git a/gcc/testsuite/g++.dg/cpp1z/lambda-this7.C b/gcc/testsuite/g++.dg/cpp1z/lambda-this7.C new file mode 100644 index 00000000000..8137061e161 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/lambda-this7.C @@ -0,0 +1,11 @@ +// PR c++/95193 +// { dg-do compile { target c++17 } } + +struct X { + void foo() const { + auto GL1 = [*this](auto a) { + }; + + GL1("abc"); + } +};