[Bug libstdc++/126807] New: simd: Tests fail on Darwin since their introduction.

"iains at gcc dot gnu.org via Gcc-bugs" <[email protected]>
Newsgroups gmane.comp.gcc.bugs
Message-ID <[email protected]/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126807

            Bug ID: 126807
           Summary: simd: Tests fail on Darwin since their introduction.
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Keywords: rejects-valid, testsuite-fail
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: iains at gcc dot gnu.org
                CC: mkretz at gcc dot gnu.org
  Target Milestone: ---
            Target: *-*-darwin*

14 simd tests introduced in r16-8243-g8be0893fd98c9a have always failed on
darwin.  Since the change to add c++29 that now gives 28 fails in libstdc++. 
See, for example:
https://gcc.gnu.org/pipermail/gcc-testresults/2026-August/884410.html

The reason is that Darwin defines math_errhandling as a function rather than a
constant.  It seems that the intent was for that case to be a substitution
failure so the __handle_fpexcept_impl fallback is chosen instead.  However,
requires-clause used to do this mentions no template parameter, so it is
non-dependent and is checked at the point of definition: there is no
substitution, so there is no substitution failure and no fallback, and a
non-constant math_errhandling is a hard error.

A possible solution would be to make the math_errhandling a template param,
thus triggering SFINAE, like below - or open to other solutions (this is not
the end of the story - fixing this exposes two other issues - one of which is a
long-term compiler-side bug).  Will cross-reference those when filed.

---- possible substitution fix....

diff --git a/libstdc++-v3/include/bits/simd_details.h
b/libstdc++-v3/include/bits/simd_details.h
index a3ec38f0dc0..46eab585eb9 100644
--- a/libstdc++-v3/include/bits/simd_details.h
+++ b/libstdc++-v3/include/bits/simd_details.h
@@ -422,12 +422,14 @@ namespace simd
   // math_errhandling may expand to an extern symbol, in which case we must
assume fp exceptions
   // need to be considered. A conforming C library must define
math_errhandling, but in case it
   // isn't defined we simply use the fallback.
+  // The macro is used as default template argument (rather than in a
requires-clause) so that a
+  // non-constant math_errhandling is a substitution failure in the immediate
context instead of a
+  // hard error at the point of definition.
 #ifdef math_errhandling
-  template <int = 0>
-    requires requires { typename bool_constant<0 != (math_errhandling &
MATH_ERREXCEPT)>; }
+  template <int _ErrHandling = math_errhandling>
     consteval bool
     __handle_fpexcept_impl(int)
-    { return 0 != (math_errhandling & MATH_ERREXCEPT); }
+    { return 0 != (_ErrHandling & MATH_ERREXCEPT); }
 #endif

   // Fallback if math_errhandling doesn't work: implement correct exception
behavior.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.