diff options
author | Patrick Palka <ppalka@redhat.com> | 2023-09-18 14:41:07 -0400 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2023-09-18 14:41:07 -0400 |
commit | a6ac1fc64c3caed19da65c2e6b12f8ddaf551231 (patch) | |
tree | 57df49e74ab211c89bd0dd1979a3dd118c7135cf /gcc/cp | |
parent | 155178ccb5f5bc89dcc8261ae1b64bc2fbfdbd45 (diff) | |
download | gcc-a6ac1fc64c3caed19da65c2e6b12f8ddaf551231.zip gcc-a6ac1fc64c3caed19da65c2e6b12f8ddaf551231.tar.gz gcc-a6ac1fc64c3caed19da65c2e6b12f8ddaf551231.tar.bz2 |
c++: unifying identical tmpls from current inst [PR108347]
Here more_specialized_partial_spec wrongly considers the two partial
specializations to be unordered ultimately because unify for identical
parm=arg=A<T>::C returns failure due to C being dependent.
This patch fixes this by relaxing unify's early-exit identity test to
also accept dependent decls; we can't deduce anything further from them
anyway. In passing this patch removes the CONST_DECL case of unify:
we should never see the CONST_DECL version of a template parameter here,
and for other CONST_DECLs (such as enumerators) it seems we can rely on
them to already have been folded to their DECL_INITIAL.
PR c++/108347
gcc/cp/ChangeLog:
* pt.cc (unify): Return unify_success for identical dependent
DECL_P 'arg' and 'parm'.
<case CONST_DECL>: Remove handling.
gcc/testsuite/ChangeLog:
* g++.dg/template/ttp41.C: New test.
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/pt.cc | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index a40b895..31ff80e 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -24559,7 +24559,8 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict, even if ARG == PARM, since we won't record unifications for the template parameters. We might need them if we're trying to figure out which of two things is more specialized. */ - if (arg == parm && !uses_template_parms (parm)) + if (arg == parm + && (DECL_P (parm) || !uses_template_parms (parm))) return unify_success (explain_p); /* Handle init lists early, so the rest of the function can assume @@ -25278,11 +25279,8 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict, strict, explain_p); case CONST_DECL: - if (DECL_TEMPLATE_PARM_P (parm)) - return unify (tparms, targs, DECL_INITIAL (parm), arg, strict, explain_p); - if (arg != scalar_constant_value (parm)) - return unify_template_argument_mismatch (explain_p, parm, arg); - return unify_success (explain_p); + /* CONST_DECL should already have been folded to its DECL_INITIAL. */ + gcc_unreachable (); case FIELD_DECL: case TEMPLATE_DECL: |