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.
This commit is contained in:
Jason Merrill 2020-06-01 17:58:57 -04:00
parent 4013baf99c
commit 4b68cb38dd
2 changed files with 13 additions and 1 deletions

View File

@ -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)

View File

@ -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");
}
};