diff --git a/flang/include/flang/Runtime/float128.h b/flang/include/flang/Runtime/float128.h --- a/flang/include/flang/Runtime/float128.h +++ b/flang/include/flang/Runtime/float128.h @@ -20,7 +20,25 @@ #ifndef FORTRAN_RUNTIME_FLOAT128_H_ #define FORTRAN_RUNTIME_FLOAT128_H_ +#ifdef __cplusplus +/* + * libc++ does not fully support __float128 right now, e.g. + * std::complex<__float128> multiplication ends up calling + * copysign() that is not defined for __float128. + * In order to check for libc++'s _LIBCPP_VERSION macro + * we need to include at least one libc++ header file. + */ +#include +#endif + #undef HAS_FLOAT128 +#if (defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)) && \ + !defined(_LIBCPP_VERSION) +/* + * It may still be worth checking for compiler versions, + * since earlier versions may define the macros above, but + * still do not support __float128 fully. + */ #if __x86_64__ #if __GNUC__ >= 7 || __clang_major__ >= 7 #define HAS_FLOAT128 1 @@ -28,5 +46,7 @@ #elif defined __PPC__ && __GNUC__ >= 8 #define HAS_FLOAT128 1 #endif +#endif /* (defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)) && \ + !defined(_LIBCPP_VERSION) */ #endif /* FORTRAN_RUNTIME_FLOAT128_H_ */