From 4b68cb38ddca37a14a6f2f43de3a6d396ee1bc79 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 1 Jun 2020 17:58:57 -0400 Subject: [PATCH] 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. --- gcc/cp/pt.c | 3 ++- gcc/testsuite/g++.dg/cpp1z/lambda-this7.C | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp1z/lambda-this7.C diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 907ca879c731..9c03c5a5bbde 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 000000000000..8137061e1611 --- /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"); + } +}; -- 2.39.2