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

--- Comment #1 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:9707d2e5dbb92d2bc990c922461a5a16ae652319

commit r12-2862-g9707d2e5dbb92d2bc990c922461a5a16ae652319
Author: Patrick Palka <ppa...@redhat.com>
Date:   Wed Aug 11 16:53:53 2021 -0400

    c++: parameterized requires-expr as default argument [PR101725]

    Here we're rejecting the default template argument

      requires (T t) { x(t); }

    because we consider the 't' in the requirement to be a local variable
    (according to local_variable_p), and we generally forbid local variables
    from appearing inside default arguments.  We can perhaps fix this by
    giving special treatment to parameters introduced by requires-expressions,
    but DR 2082 relaxed the restriction about local variables appearing within
    default arguments to permit them inside unevaluated operands thereof.
    So this patch just implements DR 2082 which also fixes this PR since a
    requires-expression is an unevaluated context.

            PR c++/101725
            DR 2082

    gcc/cp/ChangeLog:

            * cp-tree.h (unevaluated_p): Return true for REQUIRES_EXPR.
            * decl.c (local_variable_p_walkfn): Don't walk into unevaluated
            operands.
            * parser.c (cp_parser_primary_expression) <case CPP_NAME>: Never
            reject uses of local variables in unevaluated contexts.
            * tree.c (cp_walk_subtrees) <case REQUIRES_EXPR>: Increment
            cp_unevaluated_operand.  Use cp_walk_tree directly instead of
            WALK_SUBTREE to avoid the goto.  Use REQUIRES_EXPR_REQS instead
            of TREE_OPERAND directly.

    gcc/testsuite/ChangeLog:

            * g++.dg/DRs/dr2082.C: New test.
            * g++.dg/cpp2a/concepts-uneval4.C: New test.

Reply via email to