c++: Inherited constructor template arguments [PR94719]
authorPatrick Palka <ppalka@redhat.com>
Wed, 22 Apr 2020 19:57:39 +0000 (15:57 -0400)
committerPatrick Palka <ppalka@redhat.com>
Wed, 22 Apr 2020 19:57:39 +0000 (15:57 -0400)
commit72d0ef73d2cd46bda2f28e1866d637cfe8edb208
tree71668bcf94f988b25baebd3aad65073a58dbaf19
parentedfa7c684d329708dcee733fcb552bed9d931621
c++: Inherited constructor template arguments [PR94719]

My fix for PR94549 broke constraints_satisfied_p in the case where the inherited
constructor decl points to an instantiation of a constructor template coming
from an instantiation of a class template.

This is because the DECL_TI_ARGS of the inherited constructor decl in this case
contains only the innermost level of template arguments (those for the
constructor template), but constraint satisfaction expects to have the full set
of template arguments.  This causes template argument substitution during
constraint satisfaction to fail in various ways.

On the other hand, the DECL_TI_ARGS of the DECL_INHERITED_CTOR is a full set of
template arguments but with the innermost level still in its dependent form,
which is the source of PR94549.  So if we could combine these two sets of
template arguments then we'd be golden.

This patch does just that, by effectively reverting the fix for PR94549 and
instead using add_outermost_template_args to combine the template arguments of
the inherited constructor decl with those of its DECL_INHERITED_CTOR.

gcc/cp/ChangeLog:

PR c++/94719
PR c++/94549
* constraint.cc (satisfy_declaration_constraints): If the inherited
constructor points to an instantiation of a constructor template,
remember and use its attached template arguments.

gcc/testsuite/ChangeLog:

PR c++/94719
PR c++/94549
* g++.dg/cpp2a/concepts-inherit-ctor9.C: New test.
gcc/cp/ChangeLog
gcc/cp/constraint.cc
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp2a/concepts-inherit-ctor9.C [new file with mode: 0644]