#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
#elif defined __PPC__ && __GNUC__ >= 8
#define HAS_FLOAT128 1
#endif
+#endif /* (defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)) && \
+ !defined(_LIBCPP_VERSION) */
#endif /* FORTRAN_RUNTIME_FLOAT128_H_ */