c++: substituting CONST_DECL_USING_P enumerators [PR103081]
authorPatrick Palka <ppalka@redhat.com>
Sat, 3 Dec 2022 15:28:25 +0000 (10:28 -0500)
committerPatrick Palka <ppalka@redhat.com>
Sat, 3 Dec 2022 15:28:25 +0000 (10:28 -0500)
commitb3912122c9dfaba6c8229e8f095885f69782ceda
treef8ec304030ba701fd7aa6200e3182cf0baa8eecf
parent93574914e462e87e42dddd66b0dfbb9627662f33
c++: substituting CONST_DECL_USING_P enumerators [PR103081]

We implement class-scope using enum by injecting clones of the enum's
CONST_DECLs as fields of the class, for which CONST_DECL_USING_P is
true, so that qualified lookup naturally finds the enumerators.
Substitution into such a CONST_DECL currently ICEs however, because we
assume the DECL_CONTEXT is always the ENUMERAL_TYPE (which has
TYPE_VALUES) but in this case it's the RECORD_TYPE for the class scope
(which has TYPE_FIELDS).

Since these CONST_DECLs appear to always be non-dependent, this patch
fixes this by shortcutting substitution for CONST_DECLs that have
non-dependent DECL_CONTEXT.  This subsumes the existing (and seemingly
dead) DECL_NAMESPACE_SCOPE_P early exit test and also benefits
substitution into ordinary non-dependent CONST_DECLs.

PR c++/103081

gcc/cp/ChangeLog:

* pt.cc (tsubst_copy) <case CONST_DECL>: Generalize
early exit test for namespace-scope decls to check dependence of
the enclosing scope instead.  Remove dead early exit test.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/using-enum-10.C: New test.
* g++.dg/cpp2a/using-enum-10a.C: New test.
gcc/cp/pt.cc
gcc/testsuite/g++.dg/cpp2a/using-enum-10.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/using-enum-10a.C [new file with mode: 0644]