diff --git a/libc/include/llvm-libc-types/cfloat128.h b/libc/include/llvm-libc-types/cfloat128.h index 0cc8ed3041d6f..a371671cf6235 100644 --- a/libc/include/llvm-libc-types/cfloat128.h +++ b/libc/include/llvm-libc-types/cfloat128.h @@ -12,21 +12,24 @@ #include "../llvm-libc-macros/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, and only for C. For C++, or for clang, -// the complex variant of `__float128` is defined instead, and only on x86-64 -// targets. +// 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. -// https://github.com/llvm/llvm-project/issues/80195 -#if defined(__STDC_IEC_60559_COMPLEX__) && !defined(__clang__) && \ - !defined(__cplusplus) +#if defined(__STDC_IEC_60559_COMPLEX__) && !defined(__clang__) +#if !defined(__cplusplus) #define LIBC_TYPES_HAS_CFLOAT128 typedef _Complex _Float128 cfloat128; -#elif defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__) -// Use _Complex __float128 type. gcc and clang sometime use __SIZEOF_FLOAT128__ -// to notify the availability of __float128. clang also uses __FLOAT128__ macro -// to notify the availability of __float128 type: +#elif defined(__GNUC__) && __GNUC__ >= 13 +#define LIBC_TYPES_HAS_CFLOAT128 +typedef _Complex _Float128 cfloat128; +#endif +#elif __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 typedef _Complex __float128 cfloat128; diff --git a/libc/include/llvm-libc-types/cfloat16.h b/libc/include/llvm-libc-types/cfloat16.h index e7e5631e02507..2d4cef7562720 100644 --- a/libc/include/llvm-libc-types/cfloat16.h +++ b/libc/include/llvm-libc-types/cfloat16.h @@ -10,7 +10,8 @@ #define LLVM_LIBC_TYPES_CFLOAT16_H #if defined(__FLT16_MANT_DIG__) && \ - (!defined(__GNUC__) || __GNUC__ >= 13 || defined(__clang__)) && \ + (!defined(__GNUC__) || __GNUC__ >= 13 || \ + (defined(__clang__) && __clang_major__ >= 14)) && \ !defined(__arm__) && !defined(_M_ARM) && !defined(__riscv) && \ !defined(_WIN32) #define LIBC_TYPES_HAS_CFLOAT16