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

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

https://gcc.gnu.org/g:73e86b6766cc92aa8c18cc987bf95929c4ea0672

commit r12-9492-g73e86b6766cc92aa8c18cc987bf95929c4ea0672
Author: Patrick Palka <ppa...@redhat.com>
Date:   Wed Mar 1 14:09:37 2023 -0500

    c++: unevaluated array new-expr size constantness [PR108219]

    Here we're mishandling the unevaluated array new-expressions due to a
    supposed non-constant array size ever since r12-5253-g4df7f8c79835d569
    made us no longer perform constant evaluation of non-manifestly-constant
    expressions within unevaluated contexts.  This shouldn't make a difference
    here since the array sizes are constant literals, except they're expressed
    as NON_LVALUE_EXPR location wrappers around INTEGER_CST, wrappers which
    used to get stripped as part of constant evaluation and now no longer do.
    Moreover it means build_vec_init can't constant fold the MINUS_EXPR
    'maxindex' passed from build_new_1 when in an unevaluated context (since
    it tries reducing it via maybe_constant_value called with mce_unknown).

    This patch fixes these issues by making maybe_constant_value (and
    fold_non_dependent_expr) try folding an unevaluated non-manifestly-constant
    operand via fold(), as long as it simplifies to a simple constant, rather
    than doing no simplification at all.  This covers e.g. simple arithmetic
    and casts including stripping of location wrappers around INTEGER_CST.

    In passing, this patch also fixes maybe_constant_value to avoid constant
    evaluating an unevaluated operand when called with mce_false, by adjusting
    the early exit test appropriately.

    Co-authored-by: Jason Merrill <ja...@redhat.com>

            PR c++/108219
            PR c++/108218

    gcc/cp/ChangeLog:

            * constexpr.cc (fold_to_constant): Define.
            (maybe_constant_value): Move up early exit test for unevaluated
            operands.  Try reducing an unevaluated operand to a constant via
            fold_to_constant.
            (fold_non_dependent_expr_template): Add early exit test for
            CONSTANT_CLASS_P nodes.  Try reducing an unevaluated operand
            to a constant via fold_to_constant.
            * cp-tree.h (fold_to_constant): Declare.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp0x/new6.C: New test.
            * g++.dg/cpp2a/concepts-new1.C: New test.

    (cherry picked from commit 096f034a8f5df41f610e62c1592fb90a3f551cd5)
  • [Bug c++/108219] [12 Regression... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to