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

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jason at gcc dot gnu.org

--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Preprocessing the attached testcase with GCC 10 (using -std=c++20) and
compiling  with GCC 11 shows the error. Possibly a compiler bug (or invalid
code in the library, which gcc 10 doesn't complain about).

It started to fail on trunk with r11-2774

    c++: Check satisfaction before non-dep convs. [CWG2369]

    It's very hard to use concepts to protect a template from hard errors due
to
    unwanted instantiation if constraints aren't checked until after doing all
    substitution and checking of non-dependent conversions.

    It was pretty straightforward to insert the satisfaction check into the
    logic, but I needed to make the 3-parameter version of
    satisfy_declaration_constraints call push_tinst_level like the 2-parameter
    version already does.  For simplicity, I also made it add any needed outer
    template arguments from the TEMPLATE_DECL to the args.

    The testsuite changes are mostly because this change causes unsatisfaction
    to cause deduction to fail rather than reject the candidate later in
    overload resolution.

    gcc/cp/ChangeLog:

            DR 2369
            * cp-tree.h (push_tinst_level, push_tinst_level_loc): Declare.
            * constraint.cc (satisfy_declaration_constraints):
            Use add_outermost_template_args and push_tinst_level.
            * pt.c (add_outermost_template_args): Handle getting
            a TEMPLATE_DECL as the first argument.
            (push_tinst_level, push_tinst_level_loc): No longer static.
            (fn_type_unification): Check satisfaction before non-dependent
            conversions.

Reply via email to