https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107649
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> --- Although if the _GLIBCXX_FLOAT_IS_IEEE_BINARY32 macro is not defined, it will still be ambiguous, because we won't define these overloads: #if _GLIBCXX_USE_C99_COMPLEX #if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) inline _Float16 __complex_abs(__complex__ _Float16 __z) { return _Float16(__builtin_cabsf(__z)); } So should the __complex_type specializations that cause us to use __complex__ _Tp depend on those same macros? So we don't use the efficient representation unless we can also define these overloads?