]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: substituting fn parm redeclared with dep alias tmpl [PR120224]
authorPatrick Palka <ppalka@redhat.com>
Thu, 5 Jun 2025 15:07:25 +0000 (11:07 -0400)
committerPatrick Palka <ppalka@redhat.com>
Thu, 5 Jun 2025 15:07:25 +0000 (11:07 -0400)
commit51e93aadc94940e2da854cf1321a7ab1aebf8d1a
tree44b07157689934b08675393958999e682f30ddee
parente71c0157478e49188cd754693dcc2059d63573e9
c++: substituting fn parm redeclared with dep alias tmpl [PR120224]

Here we declare f twice, the second time around using a dependent
alias template.  Due to alias template transparency these are logically
the same overload.  But now the function type of f (produced from the
first declaration) diverges from the type of its formal parameter
(produced from the subsequent redefinition) in that substituting T=int
succeeds for the function type but not for the formal parameter type.
This eventually causes us to produce an undiagnosed error_mark_node in
the AST of the function call, leading to failure of the sanity check
check added in r14-6343-g0c018a74eb1aff.

Before r14-6343 we would still go on to reject the testcase later at
instantiation time, from regenerate_decl_from_template, making this a
regression.

To fix this, it seems we just need to propagate error_mark_node upon
substitution failure into the type of a PARM_DECL.

PR c++/120224

gcc/cp/ChangeLog:

* pt.cc (tsubst_function_decl): Return error_mark_node if
substituting into the formal parameter list failed.
(tsubst_decl) <case PARM_DECL>: Return error_mark_node
upon TREE_TYPE substitution failure, when in a SFINAE
context.  Return error_mark_node upon DECL_CHAIN substitution
failure.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/alias-decl-80.C: New test.

Reviewed-by: Jason Merrill <jason@redhat.com>
gcc/cp/pt.cc
gcc/testsuite/g++.dg/cpp0x/alias-decl-80.C [new file with mode: 0644]