diff --git a/libc/test/include/stdbit_test.cpp b/libc/test/include/stdbit_test.cpp index 61e241c8f68a99..5e45f971cb22bb 100644 --- a/libc/test/include/stdbit_test.cpp +++ b/libc/test/include/stdbit_test.cpp @@ -8,26 +8,38 @@ #include "test/UnitTest/Test.h" -#include - /* * The intent of this test is validate that: - * 1. We provide the definition of the various type generic macros of stdbit.h. + * 1. We provide the definition of the various type generic macros of stdbit.h + * (the macros are transitively included from stdbit-macros.h by stdbit.h). * 2. It dispatches to the correct underlying function. * Because unit tests build without public packaging, the object files produced * do not contain non-namespaced symbols. */ -unsigned char stdc_leading_zeros_uc(unsigned char) { return 0xAA; } -unsigned short stdc_leading_zeros_us(unsigned short) { return 0xAB; } -unsigned stdc_leading_zeros_ui(unsigned) { return 0xAC; } -unsigned long stdc_leading_zeros_ul(unsigned long) { return 0xAD; } -unsigned long long stdc_leading_zeros_ull(unsigned long long) { return 0xAF; } -unsigned char stdc_leading_ones_uc(unsigned char) { return 0xBA; } -unsigned short stdc_leading_ones_us(unsigned short) { return 0xBB; } -unsigned stdc_leading_ones_ui(unsigned) { return 0xBC; } -unsigned long stdc_leading_ones_ul(unsigned long) { return 0xBD; } -unsigned long long stdc_leading_ones_ull(unsigned long long) { return 0xBF; } +/* + * Declare these BEFORE including stdbit-macros.h so that this test may still be + * run even if a given target doesn't yet have these individual entrypoints + * enabled. + */ +extern "C" { +unsigned char stdc_leading_zeros_uc(unsigned char) noexcept { return 0xAA; } +unsigned short stdc_leading_zeros_us(unsigned short) noexcept { return 0xAB; } +unsigned stdc_leading_zeros_ui(unsigned) noexcept { return 0xAC; } +unsigned long stdc_leading_zeros_ul(unsigned long) noexcept { return 0xAD; } +unsigned long long stdc_leading_zeros_ull(unsigned long long) noexcept { + return 0xAF; +} +unsigned char stdc_leading_ones_uc(unsigned char) noexcept { return 0xBA; } +unsigned short stdc_leading_ones_us(unsigned short) noexcept { return 0xBB; } +unsigned stdc_leading_ones_ui(unsigned) noexcept { return 0xBC; } +unsigned long stdc_leading_ones_ul(unsigned long) noexcept { return 0xBD; } +unsigned long long stdc_leading_ones_ull(unsigned long long) noexcept { + return 0xBF; +} +} + +#include "include/llvm-libc-macros/stdbit-macros.h" TEST(LlvmLibcStdbitTest, TypeGenericMacroLeadingZeros) { EXPECT_EQ(stdc_leading_zeros(static_cast(0U)),