c++: Constrained inherited constructor template [PR94549]
authorPatrick Palka <ppalka@redhat.com>
Tue, 21 Apr 2020 22:41:02 +0000 (18:41 -0400)
committerPatrick Palka <ppalka@redhat.com>
Tue, 21 Apr 2020 22:41:02 +0000 (18:41 -0400)
commit0e665f256b4ac8c5f78713ebd4e9378fd4ecf5a8
tree62ef8f7c90b6b9c30ddcedef2cfe428c51b40641
parente76100ced607218a3bf26344fd57d7384a7c18b5
c++: Constrained inherited constructor template [PR94549]

A comment in satisfy_declaration_constraints says

  /* For inherited constructors, consider the original declaration;
     it has the correct template information attached. */
  d = strip_inheriting_ctors (d);

but it looks like this comment is wrong when the inherited constructor is for an
instantiation of a constructor template.  In that case, DECL_TEMPLATE_INFO is
correct and DECL_INHERITED_CTOR points to the constructor template of the base
class rather than to the particular instantiation of the constructor template
(and so the DECL_TI_ARGS of the DECL_INHERITED_CTOR are in their dependent
form).

So doing strip_inheriting_ctors in this case then eventually leads to
satisfy_associated_constraints returning true regardless of the constraints
themselves, due to the passed in 'args' being dependent.

An inherited constructor seems to have a non-empty DECL_TEMPLATE_INFO only when
it's for an instantiation of a constructor template, so this patch fixes this
issue by checking for empty DECL_TEMPLATE_INFO before calling
strip_inheriting_ctors.

There is another unguarded call to strip_inheriting_ctors in
get_normalized_constraints_from_decl, but this one seems to be safe to do
unconditionally because the rest of that function doesn't need/look at the
DECL_TI_ARGS of the decl.

gcc/cp/ChangeLog:

PR c++/94549
* constraint.cc (satisfy_declaration_constraints): Don't strip the
inherited constructor if it already has template information.

gcc/testsuite/ChangeLog:

PR c++/94549
* g++.dg/concepts/inherit-ctor3.C: Adjust expected diagnostics.
* g++.dg/cpp2a/concepts-inherit-ctor4.C: New test.
* g++.dg/cpp2a/concepts-inherit-ctor8.C: New test.
gcc/cp/ChangeLog
gcc/cp/constraint.cc
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/concepts/inherit-ctor3.C
gcc/testsuite/g++.dg/cpp2a/concepts-inherit-ctor4.C
gcc/testsuite/g++.dg/cpp2a/concepts-inherit-ctor8.C [new file with mode: 0644]