diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b298db46714..7380a20f132 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2020-04-22 Patrick Palka + + 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. + 2020-04-22 Jonathan Wakely PR translation/94698 diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc index c05fafe5da1..06161b8c8c4 100644 --- a/gcc/cp/constraint.cc +++ b/gcc/cp/constraint.cc @@ -2736,12 +2736,17 @@ static tree satisfy_declaration_constraints (tree t, subst_info info) { gcc_assert (DECL_P (t)); + const tree saved_t = t; - if (!DECL_TEMPLATE_INFO (t)) - /* For inherited constructors without template information, consider - the original declaration; it has the correct template information - attached. */ - t = strip_inheriting_ctors (t); + /* For inherited constructors, consider the original declaration; + it has the correct template information attached. */ + t = strip_inheriting_ctors (t); + tree inh_ctor_targs = NULL_TREE; + if (t != saved_t) + if (tree ti = DECL_TEMPLATE_INFO (saved_t)) + /* The inherited constructor points to an instantiation of a constructor + template; remember its template arguments. */ + inh_ctor_targs = TI_ARGS (ti); /* Update the declaration for diagnostics. */ info.in_decl = t; @@ -2761,6 +2766,8 @@ satisfy_declaration_constraints (tree t, subst_info info) /* The initial parameter mapping is the complete set of template arguments substituted into the declaration. */ args = TI_ARGS (ti); + if (inh_ctor_targs) + args = add_outermost_template_args (args, inh_ctor_targs); } else { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 955418f669a..1115eb76968 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2020-04-22 Patrick Palka + + PR c++/94719 + PR c++/94549 + * g++.dg/cpp2a/concepts-inherit-ctor9.C: New test. + 2020-04-22 Marek Polacek PR c++/93807 diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-inherit-ctor9.C b/gcc/testsuite/g++.dg/cpp2a/concepts-inherit-ctor9.C new file mode 100644 index 00000000000..7d3201bff9f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-inherit-ctor9.C @@ -0,0 +1,20 @@ +// PR c++/94719 +// { dg-do compile { target concepts } } + +template +struct bar +{ + template requires (N == 5) + bar() { } +}; + +template +struct foo : bar +{ + using foo::bar::bar; +}; + +void baz() +{ + foo{}; +}