rsmith added inline comments.
================ Comment at: clang/test/SemaCXX/rounding-math.cpp:9 + +constexpr int f(int n) { return int(n * (1.0 / 3.0)); } + ---------------- rsmith wrote: > sepavloff wrote: > > This code requires additional solution. The function body is built using > > dynamic rounding mode, which breaks its constexprness. We can avoid this > > kind of errors if we assume that body of a constexpr function is parsed > > using constant rounding mode (in this example it is the default mode). It > > makes parsing constexpr function different from non-constexpr ones, but > > enables convenient use: > > ``` > > constexpr int add(float x, float y) { return x + y; } > > > > #pragma STDC FENV_ROUND FE_UPWARD > > int a2 = add(2.0F, 0x1.000002p0F); > > > > #pragma STDC FENV_ROUND FE_DOWNWARD > > int a3 = add(2.0F, 0x1.000002p0F); > > ``` > > If calls of constexpr functions are processes with FP options acting in the > > call site, a call to constexpr function becomes equivalent to execution of > > statements of its body. > I don't understand what you mean by "breaks its constexprness". Using a > dynamic rounding mode for the body of the function is exactly what we want > here. When the function is called in a manifestly constant evaluated context, > we should use the default rounding mode, and when it's called at runtime, we > use the appropriate dynamic rounding mode; if we try to constant evaluate it > outside of a manifestly constant evaluated constant, we deem it non-constant. > > When `constexpr` function is called at runtime, it's a completely normal > function with normal semantics. It would be wrong to use the default rounding > mode when parsing its body. To be clear: in your example with `add`, both `a2` and `a3` should be initialized to the same value, which should be rounded with the default rounding mode. Per ISO18661, `FENV_ROUND` only affects operations in its lexical scope, not functions called within those operations, and per the regular C++ rules, `constexpr` functions behave like regular functions, not like macros. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D89360/new/ https://reviews.llvm.org/D89360 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits