[flang] Restrict __float128 support for some build configurations.
authorSlava Zakharin <szakharin@nvidia.com>
Tue, 18 Oct 2022 00:48:05 +0000 (17:48 -0700)
committerSlava Zakharin <szakharin@nvidia.com>
Tue, 18 Oct 2022 16:58:05 +0000 (09:58 -0700)
This change is intended to resolve build issues reported in D134503.
A compiler supporting __float128 must define either __FLOAT128__ or
__SIZEOF_FLOAT128__ (or both). Additional check for _LIBCPP_VERSION
was added to disable __float128 for builds with libc++, because
__float128 support is incomplete there.

Differential Revision: https://reviews.llvm.org/D136121

flang/include/flang/Runtime/float128.h

index e222c6d..2362929 100644 (file)
 #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 <cstddef>
+#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_ */