[libc-commits] [libc] caf5fb1 - [libc] Implement `CMPLX` for clang < 12 (#157096)

via libc-commits libc-commits at lists.llvm.org
Fri Sep 5 07:46:42 PDT 2025


Author: Connector Switch
Date: 2025-09-05T10:46:38-04:00
New Revision: caf5fb1c400bb825c90193719806ac373e94a981

URL: https://github.com/llvm/llvm-project/commit/caf5fb1c400bb825c90193719806ac373e94a981
DIFF: https://github.com/llvm/llvm-project/commit/caf5fb1c400bb825c90193719806ac373e94a981.diff

LOG: [libc] Implement `CMPLX` for clang < 12 (#157096)

Fixes
https://github.com/llvm/llvm-project/pull/156344#issuecomment-3256837826

Added: 
    

Modified: 
    libc/include/llvm-libc-macros/complex-macros.h

Removed: 
    


################################################################################
diff  --git a/libc/include/llvm-libc-macros/complex-macros.h b/libc/include/llvm-libc-macros/complex-macros.h
index d98c6fdb306c8..e7b0edf96142d 100644
--- a/libc/include/llvm-libc-macros/complex-macros.h
+++ b/libc/include/llvm-libc-macros/complex-macros.h
@@ -22,21 +22,26 @@
 
 // TODO: Add imaginary macros once GCC or Clang support _Imaginary builtin-type.
 
-#define CMPLX(x, y) __builtin_complex((double)(x), (double)(y))
-#define CMPLXF(x, y) __builtin_complex((float)(x), (float)(y))
-#define CMPLXL(x, y) __builtin_complex((long double)(x), (long double)(y))
+#if __has_builtin(__builtin_complex)
+#define __CMPLX(r, i, t) (__builtin_complex((t)(r), (t)(i)))
+#else
+#define __CMPLX(r, i, t) ((_Complex t){(t)(r), (t)(i)})
+#endif
+
+#define CMPLX(r, i) __CMPLX(r, i, double)
+#define CMPLXF(r, i) __CMPLX(r, i, float)
+#define CMPLXL(r, i) __CMPLX(r, i, long double)
 
 #ifdef LIBC_TYPES_HAS_CFLOAT16
 #if !defined(__clang__) || (__clang_major__ >= 22 && __clang_minor__ > 0)
-#define CMPLXF16(x, y) __builtin_complex((_Float16)(x), (_Float16)(y))
+#define CMPLXF16(r, i) __CMPLX(r, i, _Float16)
 #else
-#define CMPLXF16(x, y)                                                         \
-  ((complex _Float16)(__builtin_complex((float)(x), (float)(y))))
+#define CMPLXF16(r, i) ((complex _Float16)(__CMPLX(r, i, float)))
 #endif
 #endif // LIBC_TYPES_HAS_CFLOAT16
 
 #ifdef LIBC_TYPES_HAS_CFLOAT128
-#define CMPLXF128(x, y) __builtin_complex((float128)(x), (float128)(y))
+#define CMPLXF128(r, i) __CMPLX(r, i, float128)
 #endif // LIBC_TYPES_HAS_CFLOAT128
 
 #endif // __STDC_NO_COMPLEX__


        


More information about the libc-commits mailing list