Skip to content

Commit 5a7a8f7

Browse files
[libc] fix type generic stdc_leading_zeros for GCC (#79917)
GCC does not support _Generic in C++ mode. Use inline function definitions with function overloading in __cplusplus mode.
1 parent 577738a commit 5a7a8f7

File tree

3 files changed

+20
-5
lines changed

3 files changed

+20
-5
lines changed

libc/include/llvm-libc-macros/stdbit-macros.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,30 @@
99
#ifndef __LLVM_LIBC_MACROS_STDBIT_MACROS_H
1010
#define __LLVM_LIBC_MACROS_STDBIT_MACROS_H
1111

12+
#ifdef __cplusplus
13+
inline unsigned char stdc_leading_zeros(unsigned char x) {
14+
return stdc_leading_zeros_uc(x);
15+
}
16+
inline unsigned short stdc_leading_zeros(unsigned short x) {
17+
return stdc_leading_zeros_us(x);
18+
}
19+
inline unsigned stdc_leading_zeros(unsigned x) {
20+
return stdc_leading_zeros_ui(x);
21+
}
22+
inline unsigned long stdc_leading_zeros(unsigned long x) {
23+
return stdc_leading_zeros_ul(x);
24+
}
25+
inline unsigned long long stdc_leading_zeros(unsigned long long x) {
26+
return stdc_leading_zeros_ull(x);
27+
}
28+
#else
1229
#define stdc_leading_zeros(x) \
1330
_Generic((x), \
1431
unsigned char: stdc_leading_zeros_uc, \
1532
unsigned short: stdc_leading_zeros_us, \
1633
unsigned: stdc_leading_zeros_ui, \
1734
unsigned long: stdc_leading_zeros_ul, \
1835
unsigned long long: stdc_leading_zeros_ull)(x)
36+
#endif // __cplusplus
1937

2038
#endif // __LLVM_LIBC_MACROS_STDBIT_MACROS_H

libc/include/stdbit.h.def

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010
#define LLVM_LIBC_STDBIT_H
1111

1212
#include <__llvm-libc-common.h>
13-
#include <llvm-libc-macros/stdbit-macros.h>
1413

1514
%%public_api()
1615

16+
#include <llvm-libc-macros/stdbit-macros.h>
17+
1718
#endif // LLVM_LIBC_STDBIT_H

libc/test/include/CMakeLists.txt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,5 @@ if (LLVM_LIBC_FULL_BUILD)
3131
# simply testing the macros provided by stdbit.h, not the implementation
3232
# of the underlying functions which the type generic macros may dispatch
3333
# to.
34-
COMPILE_OPTIONS
35-
# stdbit.h is full of type generic macros implemented via C11 _Generic.
36-
# Clang will produce -Wno-c11-extensions when using _Generic in C++ mode.
37-
-Wno-c11-extensions
3834
)
3935
endif()

0 commit comments

Comments
 (0)