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

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

https://gcc.gnu.org/g:53caa4723d8de73fe21e63ba264082f3071b2887

commit r12-5696-g53caa4723d8de73fe21e63ba264082f3071b2887
Author: Jason Merrill <ja...@redhat.com>
Date:   Wed Nov 24 05:45:02 2021 -0500

    c++: constexpr, fold, weak redecl, fp/0 [PR103310]

    For PR61825, honza changed tree_single_nonzero_warnv_p to prevent a later
    declaration from marking a function as weak after we've determined that it
    wasn't weak before.  But we shouldn't do that for speculative folding; we
    should only do it when we actually need a constant value.  In C++, such a
    context is called "manifestly constant-evaluated".  In fold, this seems to
    correspond to the folding_initializer flag, since in C this situation only
    occurs in static initializers.

    This change makes nonzero-1.c well-formed; I've added a nonzero-1a.c to
    verify that we delete the null check eventually if there is no weak
    redeclaration.

    The varasm.c change is so that if we do get the weak redeclaration error,
we
    get it at the position of the weak declaration rather than the previous
    declaration.

    Using the FOLD_INIT paths also affects floating point arithmetic: notably,
    this makes floating point division by zero in a manifestly
    constant-evaluated context constant, as in a C static initializer.  I've
had
    some success convincing CWG that this is the right direction; C++ should
    follow C's floating point semantics more than we have been doing, and
Joseph
    says that the C policy is that Annex F overrides other parts of the
standard
    that say that some operations are undefined.  But since we're in stage 3,
    I'm only making this change with the new flag -fconstexpr-fp-except.  It
may
    turn on by default in a future release.

    I think this distinction is only relevant for binary operations; arithmetic
    for the floating point case, comparison for possibly non-zero addresses.

            PR c++/103310

    gcc/ChangeLog:

            * fold-const.c (maybe_nonzero_address): Use get_create or get
            depending on folding_initializer.
            (fold_binary_initializer_loc): New.
            * fold-const.h (fold_binary_initializer_loc): Declare.
            * varasm.c (mark_weak): Don't use the decl location.
            * doc/invoke.texi: Document -fconstexpr-fp-except.

    gcc/c-family/ChangeLog:

            * c.opt: Add -fconstexpr-fp-except.

    gcc/cp/ChangeLog:

            * constexpr.c (cxx_eval_binary_expression): Use
            fold_binary_initializer_loc if manifestly cxeval.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp0x/constexpr-fp-except1.C: New test.
            * g++.dg/cpp1z/constexpr-if36.C: New test.
            * gcc.dg/tree-ssa/nonzero-1.c: Now well-formed.
            * gcc.dg/tree-ssa/nonzero-1a.c: New test.

Reply via email to