Hi!

Two spots in this test (which has been added to make sure we handle
floating-point overflow, underflow and other cases as per
https://wg21.link/P3899R3 during constant evaluation) fail when long double
is IBM double double.
The problem is that our real.cc emulation of this type is imprecise, we
handle it basically as fixed 106 bit mantissa and exponent range of double,
when it actually is an addition of two double values with some rules (the
main one is that the upper double should be always equal to the whole value
rounded to double).  So, it is effectively dynamic precision from 53 bits
(for denormals) up to some 1000 something bits depending on the exact
values.  Until we rewrite the real.cc emulation of this mode as operations
on a pair of doubles (if ever), we have cases like
      /* Don't constant fold this floating point operation if the
         result may dependent upon the run-time rounding mode and
         flag_rounding_math is set, or if GCC's software emulation
         is unable to accurately represent the result.  */
      if ((flag_rounding_math
           || (MODE_COMPOSITE_P (mode) && !flag_unsafe_math_optimizations))
          && (inexact || !real_identical (&result, &value)))
        return NULL_TREE;
and so instead of getting wrong results we choose not to constant evaluate
it in some cases, in this testcase the minld/maxld and minld*minld cases are
inexact and so we punt.

The following patch makes those dg-bogus xfailed on IBM double double long
double targets to make it clear that it is a bug, but expected one.

Tested on powerpc64-linux (-m32/-m64), x86_64-linux and i686-linux, ok for
trunk?

2026-09-17  Jakub Jelinek  <[email protected]>

        * g++.dg/cpp29/std-floating1.C: Add 2 dg-bogus directives xfailed
        for long_double_is_ibm128 effective targets.

--- a/gcc/testsuite/g++.dg/cpp29/std-floating1.C        2026-09-17 
11:26:30.734636019 +0000
+++ b/gcc/testsuite/g++.dg/cpp29/std-floating1.C        2026-09-17 
20:46:15.497246294 +0000
@@ -46,11 +46,12 @@ constexpr long double snanld = __builtin
 
 constexpr long double inf2ld = infld * 2.0L; // OK, also positive infinity
 constexpr long double zerold = minld / maxld; // OK, result cannot be 
represented, and is rounded to zero
+                                             // { dg-bogus "is not a constant 
expression" "" { xfail long_double_is_ibm128 } .-1 }
 constexpr long double oflold = maxld * 2.0L; // { dg-error "is not a constant 
expression" }
 constexpr long double nan2ld = nanld * 2.0L; // OK, propagating a NaN
 constexpr long double udefld = infld * 0.0L; // { dg-error "is not a constant 
expression" }
 constexpr long double div0ld = maxld / 0.0L; // { dg-error "is not a constant 
expression" }
-constexpr long double zero2ld = minld * minld;
+constexpr long double zero2ld = minld * minld; // { dg-bogus "is not a 
constant expression" "" { xfail long_double_is_ibm128 } }
 constexpr bool nancmpld = nanld < 0.0L;
 constexpr long double snan2ld = snanld * 2.0L;
 constexpr long double div02ld = 1.0L / 0.0L; // { dg-error "is not a constant 
expression" }

        Jakub

Reply via email to