https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119401
--- Comment #6 from Patrick Palka <ppalka at gcc dot gnu.org> ---
We could detect if there was an intervening redeclaration by comparing the
source location of the specialization vs that of the prevailing template
declaration:
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 1f5ab4e3f71..f3240ae40dc 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -27230,7 +27230,12 @@ regenerate_decl_from_template (tree decl, tree tmpl,
tree args)
goto done;
/* Use the source location of the definition. */
- DECL_SOURCE_LOCATION (decl) = DECL_SOURCE_LOCATION (tmpl);
+ bool locs_differ = false;
+ if (DECL_SOURCE_LOCATION (decl) != DECL_SOURCE_LOCATION (tmpl))
+ {
+ locs_differ = true;
+ DECL_SOURCE_LOCATION (decl) = DECL_SOURCE_LOCATION (tmpl);
+ }
args_depth = TMPL_ARGS_DEPTH (args);
parms_depth = TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl));
@@ -27251,9 +27256,11 @@ regenerate_decl_from_template (tree decl, tree tmpl,
tree args)
}
/* Merge parameter declarations. */
- if (tree pattern_parm
- = skip_artificial_parms_for (code_pattern,
- DECL_ARGUMENTS (code_pattern)))
+ if (!locs_differ)
+ /* The prevailing parameters are unchanged. */;
+ else if (tree pattern_parm
+ = skip_artificial_parms_for (code_pattern,
+ DECL_ARGUMENTS (code_pattern)))
{
tree *p = &DECL_ARGUMENTS (decl);
for (int skip = num_artificial_parms_for (decl); skip; --skip)
This fixes the testcase, and doesn't seem to introduce any testsuite
regressions.