https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94549

--- Comment #3 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Patrick Palka <ppa...@gcc.gnu.org>:

https://gcc.gnu.org/g:0e665f256b4ac8c5f78713ebd4e9378fd4ecf5a8

commit r10-7859-g0e665f256b4ac8c5f78713ebd4e9378fd4ecf5a8
Author: Patrick Palka <ppa...@redhat.com>
Date:   Tue Apr 21 18:41:02 2020 -0400

    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.

Reply via email to