//===-- Detection of _Complex _Float128 compiler builtin type -------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_LIBC_MACROS_CFLOAT128_MACROS_H #define LLVM_LIBC_MACROS_CFLOAT128_MACROS_H #include "float-macros.h" // LDBL_MANT_DIG // Currently, the complex variant of C23 `_Float128` type is only defined as a // built-in type in GCC 7 or later, for C and in GCC 13 or later, for C++. For // clang, the complex variant of `__float128` is defined instead, and only on // x86-64 targets for clang 11 or later. // // TODO: Update the complex variant of C23 `_Float128` type detection again when // clang supports it. #ifdef __clang__ #if (__clang_major__ >= 11) && \ (defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)) // Use _Complex __float128 type. clang uses __SIZEOF_FLOAT128__ or __FLOAT128__ // macro to notify the availability of __float128 type: // https://reviews.llvm.org/D15120 #define LIBC_TYPES_HAS_CFLOAT128 #endif #elif defined(__GNUC__) #if (defined(__STDC_IEC_60559_COMPLEX__) || defined(__SIZEOF_FLOAT128__)) && \ (__GNUC__ >= 13 || (!defined(__cplusplus))) #define LIBC_TYPES_HAS_CFLOAT128 #endif #endif #if !defined(LIBC_TYPES_HAS_CFLOAT128) && (LDBL_MANT_DIG == 113) #define LIBC_TYPES_HAS_CFLOAT128 #define LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE #endif #endif // LLVM_LIBC_MACROS_CFLOAT128_MACROS_H