Can you double check? Integer division by zero is undefined, but isn't floating point division by zero defined by the appropriate IEEE standards?
Roger -- -----Original Message----- From: Xi Ruoyao <xry...@mengyan1223.wang> Sent: 21 September 2021 14:07 To: Roger Sayle <ro...@nextmovesoftware.com>; 'GCC Patches' <gcc-patches@gcc.gnu.org> Subject: Re: [RFC/PATCH] C++ constexpr vs. floating point exceptions. On Tue, 2021-09-21 at 12:41 +0100, Roger Sayle wrote: > > I was wondering if I may ask the C++ language experts for their > opinion on whether (potential) floating point exceptions/traps can be > ignored in constant expressions; this is related to PR c++/96862. I > think my question boils down to whether (or not) the following is > valid C++: > > constexpr float my_inf = 7.0 / 0.0; It's not. C++ disallows constexpr from invoking undefined behaviors in Clauses 4 through 19, while division by zero is an undefined behavior in Clause 8. > [This is currently an error with "-O2", but OK with "-O2 -ffast- > math"!] > There's a long history of g++'s semantics being accidentally tied to > the middle-end's constant folding, such that the current status quo is > that some middle-end bugs can't be fixed without breaking C++, and > vice versa. I'm hoping that the patch below (following Jakub's lead > with rounding math) might be a next step to improving things, provided > that my understanding of the desired/correct behaviour of the C++ > front-end is correct. > > This patch has been tested on x86_64-pc-linux-gnu with a "make > bootstrap" > and "make -k check" with no new failures after tweaking two checks in > g++.dg/ubsan/pr63956.C. > With this change the middle-end can become more strict about > respecting flag_trapping_math without affecting C++'s behavior. > Ideally, what the front-end considers valid should be independent of > whether the user specified -fno-trapping-math (or > -ffast-math) to the middle-end. I think we can allow a constexpr to contain floating div-by-zero with - fno-trapping-math, if we consider -fno-trapping-math make the behavior "no longer undefined" but I'm not sure. However -ffast-math also enables -ffinite-math-only, which makes div-by- zero absolutely undefined. So to me the expected behavior is: g++ t.cc -> Compile error g++ t.cc -ffast-math -> Compile error g++ t.cc -fno-trapping-math -> Ok g++ t.cc -fno-trapping-math -ffinite-math-only -> Compile Error > Thoughts? Ok for mainline? Based on the reasoning above I think it's not OK. But anyway I'm not a maintainer. > 2021-09-21 Roger Sayle <ro...@nextmovesoftware.com> > > gcc/cp/ChangeLog > * constexpr.c (cxx_eval_outermost_const_expr): Temporarily > disable > the middle-end from honoring floating point exceptions/traps > while > folding "manifestly constant" expressions. > > gcc/testsuite/ChangeLog > * g++.dg/ubsan/pr63956.C: Update to (always) allow floating > point > division in constexpr (if both operands are constexpr). > > Roger > -- > -- Xi Ruoyao <xry...@mengyan1223.wang> School of Aerospace Science and Technology, Xidian University