Skip to content

Commit 3d94a20

Browse files
authored
[libc] Fix multiply-defined global functions in ctype tests (#119055)
For whatever reason, each ctype test contains its own copy of some identical helper source code. These local helpers were defined with external linkage for no apparent reason. This leads to multiple definition errors when linking these tests together. This change moves each file's local helper code into an anonymous namespace so it has internal linkage. It's notable that the libc test code does not follow the most common norm of gtest-style code where all the `TEST(...)` cases themselves are defined inside an anonymous namespace (along with whatever other local helpers they use); whether libc's tests should follow that usual convention can be addressed holistically in future discussion. The replacement of numerous cut&paste'd copies of identical helper code with sharing the source code in some usual fashion is also left for later cleanup. This change only makes the test code not straightforwardly have multiple definition errors that prevent linking a test executable at all.
1 parent 1a781e9 commit 3d94a20

File tree

8 files changed

+113
-81
lines changed

8 files changed

+113
-81
lines changed

libc/test/src/ctype/isalnum_test.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,7 @@
1111

1212
#include "test/UnitTest/Test.h"
1313

14-
TEST(LlvmLibcIsAlNum, SimpleTest) {
15-
EXPECT_NE(LIBC_NAMESPACE::isalnum('a'), 0);
16-
EXPECT_NE(LIBC_NAMESPACE::isalnum('B'), 0);
17-
EXPECT_NE(LIBC_NAMESPACE::isalnum('3'), 0);
18-
19-
EXPECT_EQ(LIBC_NAMESPACE::isalnum(' '), 0);
20-
EXPECT_EQ(LIBC_NAMESPACE::isalnum('?'), 0);
21-
EXPECT_EQ(LIBC_NAMESPACE::isalnum('\0'), 0);
22-
EXPECT_EQ(LIBC_NAMESPACE::isalnum(-1), 0);
23-
}
14+
namespace {
2415

2516
// TODO: Merge the ctype tests using this framework.
2617
constexpr char ALNUM_ARRAY[] = {
@@ -38,6 +29,19 @@ bool in_span(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
3829
return false;
3930
}
4031

32+
} // namespace
33+
34+
TEST(LlvmLibcIsAlNum, SimpleTest) {
35+
EXPECT_NE(LIBC_NAMESPACE::isalnum('a'), 0);
36+
EXPECT_NE(LIBC_NAMESPACE::isalnum('B'), 0);
37+
EXPECT_NE(LIBC_NAMESPACE::isalnum('3'), 0);
38+
39+
EXPECT_EQ(LIBC_NAMESPACE::isalnum(' '), 0);
40+
EXPECT_EQ(LIBC_NAMESPACE::isalnum('?'), 0);
41+
EXPECT_EQ(LIBC_NAMESPACE::isalnum('\0'), 0);
42+
EXPECT_EQ(LIBC_NAMESPACE::isalnum(-1), 0);
43+
}
44+
4145
TEST(LlvmLibcIsAlNum, DefaultLocale) {
4246
// Loops through all characters, verifying that numbers and letters
4347
// return non-zero integer and everything else returns a zero.

libc/test/src/ctype/isalpha_test.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,7 @@
1111

1212
#include "test/UnitTest/Test.h"
1313

14-
TEST(LlvmLibcIsAlpha, SimpleTest) {
15-
EXPECT_NE(LIBC_NAMESPACE::isalpha('a'), 0);
16-
EXPECT_NE(LIBC_NAMESPACE::isalpha('B'), 0);
17-
18-
EXPECT_EQ(LIBC_NAMESPACE::isalpha('3'), 0);
19-
EXPECT_EQ(LIBC_NAMESPACE::isalpha(' '), 0);
20-
EXPECT_EQ(LIBC_NAMESPACE::isalpha('?'), 0);
21-
EXPECT_EQ(LIBC_NAMESPACE::isalpha('\0'), 0);
22-
EXPECT_EQ(LIBC_NAMESPACE::isalpha(-1), 0);
23-
}
14+
namespace {
2415

2516
// TODO: Merge the ctype tests using this framework.
2617
constexpr char ALPHA_ARRAY[] = {
@@ -37,6 +28,19 @@ bool in_span(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
3728
return false;
3829
}
3930

31+
} // namespace
32+
33+
TEST(LlvmLibcIsAlpha, SimpleTest) {
34+
EXPECT_NE(LIBC_NAMESPACE::isalpha('a'), 0);
35+
EXPECT_NE(LIBC_NAMESPACE::isalpha('B'), 0);
36+
37+
EXPECT_EQ(LIBC_NAMESPACE::isalpha('3'), 0);
38+
EXPECT_EQ(LIBC_NAMESPACE::isalpha(' '), 0);
39+
EXPECT_EQ(LIBC_NAMESPACE::isalpha('?'), 0);
40+
EXPECT_EQ(LIBC_NAMESPACE::isalpha('\0'), 0);
41+
EXPECT_EQ(LIBC_NAMESPACE::isalpha(-1), 0);
42+
}
43+
4044
TEST(LlvmLibcIsAlpha, DefaultLocale) {
4145
// Loops through all characters, verifying that letters return a
4246
// non-zero integer and everything else returns zero.

libc/test/src/ctype/isdigit_test.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,7 @@
1111

1212
#include "test/UnitTest/Test.h"
1313

14-
TEST(LlvmLibcIsDigit, SimpleTest) {
15-
EXPECT_NE(LIBC_NAMESPACE::isdigit('3'), 0);
16-
17-
EXPECT_EQ(LIBC_NAMESPACE::isdigit('a'), 0);
18-
EXPECT_EQ(LIBC_NAMESPACE::isdigit('B'), 0);
19-
EXPECT_EQ(LIBC_NAMESPACE::isdigit(' '), 0);
20-
EXPECT_EQ(LIBC_NAMESPACE::isdigit('?'), 0);
21-
EXPECT_EQ(LIBC_NAMESPACE::isdigit('\0'), 0);
22-
EXPECT_EQ(LIBC_NAMESPACE::isdigit(-1), 0);
23-
}
14+
namespace {
2415

2516
// TODO: Merge the ctype tests using this framework.
2617
constexpr char DIGIT_ARRAY[] = {
@@ -34,6 +25,19 @@ bool in_span(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
3425
return false;
3526
}
3627

28+
} // namespace
29+
30+
TEST(LlvmLibcIsDigit, SimpleTest) {
31+
EXPECT_NE(LIBC_NAMESPACE::isdigit('3'), 0);
32+
33+
EXPECT_EQ(LIBC_NAMESPACE::isdigit('a'), 0);
34+
EXPECT_EQ(LIBC_NAMESPACE::isdigit('B'), 0);
35+
EXPECT_EQ(LIBC_NAMESPACE::isdigit(' '), 0);
36+
EXPECT_EQ(LIBC_NAMESPACE::isdigit('?'), 0);
37+
EXPECT_EQ(LIBC_NAMESPACE::isdigit('\0'), 0);
38+
EXPECT_EQ(LIBC_NAMESPACE::isdigit(-1), 0);
39+
}
40+
3741
TEST(LlvmLibcIsDigit, DefaultLocale) {
3842
// Loops through all characters, verifying that numbers and letters
3943
// return non-zero integer and everything else returns a zero.

libc/test/src/ctype/islower_test.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,7 @@
1111

1212
#include "test/UnitTest/Test.h"
1313

14-
TEST(LlvmLibcIsLower, SimpleTest) {
15-
EXPECT_NE(LIBC_NAMESPACE::islower('a'), 0);
16-
17-
EXPECT_EQ(LIBC_NAMESPACE::islower('B'), 0);
18-
EXPECT_EQ(LIBC_NAMESPACE::islower('3'), 0);
19-
EXPECT_EQ(LIBC_NAMESPACE::islower(' '), 0);
20-
EXPECT_EQ(LIBC_NAMESPACE::islower('?'), 0);
21-
EXPECT_EQ(LIBC_NAMESPACE::islower('\0'), 0);
22-
EXPECT_EQ(LIBC_NAMESPACE::islower(-1), 0);
23-
}
14+
namespace {
2415

2516
// TODO: Merge the ctype tests using this framework.
2617
constexpr char LOWER_ARRAY[] = {
@@ -35,6 +26,19 @@ bool in_span(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
3526
return false;
3627
}
3728

29+
} // namespace
30+
31+
TEST(LlvmLibcIsLower, SimpleTest) {
32+
EXPECT_NE(LIBC_NAMESPACE::islower('a'), 0);
33+
34+
EXPECT_EQ(LIBC_NAMESPACE::islower('B'), 0);
35+
EXPECT_EQ(LIBC_NAMESPACE::islower('3'), 0);
36+
EXPECT_EQ(LIBC_NAMESPACE::islower(' '), 0);
37+
EXPECT_EQ(LIBC_NAMESPACE::islower('?'), 0);
38+
EXPECT_EQ(LIBC_NAMESPACE::islower('\0'), 0);
39+
EXPECT_EQ(LIBC_NAMESPACE::islower(-1), 0);
40+
}
41+
3842
TEST(LlvmLibcIsLower, DefaultLocale) {
3943
// Loops through all characters, verifying that numbers and letters
4044
// return non-zero integer and everything else returns a zero.

libc/test/src/ctype/isupper_test.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,7 @@
1111

1212
#include "test/UnitTest/Test.h"
1313

14-
TEST(LlvmLibcIsUpper, SimpleTest) {
15-
EXPECT_NE(LIBC_NAMESPACE::isupper('B'), 0);
16-
17-
EXPECT_EQ(LIBC_NAMESPACE::isupper('a'), 0);
18-
EXPECT_EQ(LIBC_NAMESPACE::isupper('3'), 0);
19-
EXPECT_EQ(LIBC_NAMESPACE::isupper(' '), 0);
20-
EXPECT_EQ(LIBC_NAMESPACE::isupper('?'), 0);
21-
EXPECT_EQ(LIBC_NAMESPACE::isupper('\0'), 0);
22-
EXPECT_EQ(LIBC_NAMESPACE::isupper(-1), 0);
23-
}
14+
namespace {
2415

2516
// TODO: Merge the ctype tests using this framework.
2617
constexpr char UPPER_ARRAY[] = {
@@ -35,6 +26,19 @@ bool in_span(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
3526
return false;
3627
}
3728

29+
} // namespace
30+
31+
TEST(LlvmLibcIsUpper, SimpleTest) {
32+
EXPECT_NE(LIBC_NAMESPACE::isupper('B'), 0);
33+
34+
EXPECT_EQ(LIBC_NAMESPACE::isupper('a'), 0);
35+
EXPECT_EQ(LIBC_NAMESPACE::isupper('3'), 0);
36+
EXPECT_EQ(LIBC_NAMESPACE::isupper(' '), 0);
37+
EXPECT_EQ(LIBC_NAMESPACE::isupper('?'), 0);
38+
EXPECT_EQ(LIBC_NAMESPACE::isupper('\0'), 0);
39+
EXPECT_EQ(LIBC_NAMESPACE::isupper(-1), 0);
40+
}
41+
3842
TEST(LlvmLibcIsUpper, DefaultLocale) {
3943
// Loops through all characters, verifying that numbers and letters
4044
// return non-zero integer and everything else returns a zero.

libc/test/src/ctype/isxdigit_test.cpp

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,7 @@
1111

1212
#include "test/UnitTest/Test.h"
1313

14-
TEST(LlvmLibcIsXdigit, SimpleTest) {
15-
EXPECT_NE(LIBC_NAMESPACE::isxdigit('a'), 0);
16-
EXPECT_NE(LIBC_NAMESPACE::isxdigit('B'), 0);
17-
EXPECT_NE(LIBC_NAMESPACE::isxdigit('3'), 0);
18-
19-
EXPECT_EQ(LIBC_NAMESPACE::isxdigit('z'), 0);
20-
EXPECT_EQ(LIBC_NAMESPACE::isxdigit(' '), 0);
21-
EXPECT_EQ(LIBC_NAMESPACE::isxdigit('?'), 0);
22-
EXPECT_EQ(LIBC_NAMESPACE::isxdigit('\0'), 0);
23-
EXPECT_EQ(LIBC_NAMESPACE::isxdigit(-1), 0);
24-
}
14+
namespace {
2515

2616
// TODO: Merge the ctype tests using this framework.
2717
constexpr char XDIGIT_ARRAY[] = {
@@ -36,6 +26,20 @@ bool in_span(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
3626
return false;
3727
}
3828

29+
} // namespace
30+
31+
TEST(LlvmLibcIsXdigit, SimpleTest) {
32+
EXPECT_NE(LIBC_NAMESPACE::isxdigit('a'), 0);
33+
EXPECT_NE(LIBC_NAMESPACE::isxdigit('B'), 0);
34+
EXPECT_NE(LIBC_NAMESPACE::isxdigit('3'), 0);
35+
36+
EXPECT_EQ(LIBC_NAMESPACE::isxdigit('z'), 0);
37+
EXPECT_EQ(LIBC_NAMESPACE::isxdigit(' '), 0);
38+
EXPECT_EQ(LIBC_NAMESPACE::isxdigit('?'), 0);
39+
EXPECT_EQ(LIBC_NAMESPACE::isxdigit('\0'), 0);
40+
EXPECT_EQ(LIBC_NAMESPACE::isxdigit(-1), 0);
41+
}
42+
3943
TEST(LlvmLibcIsXdigit, DefaultLocale) {
4044
// Loops through all characters, verifying that numbers and letters
4145
// return non-zero integer and everything else returns a zero.

libc/test/src/ctype/tolower_test.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,7 @@
1111

1212
#include "test/UnitTest/Test.h"
1313

14-
TEST(LlvmLibcToLower, SimpleTest) {
15-
EXPECT_EQ(LIBC_NAMESPACE::tolower('a'), int('a'));
16-
EXPECT_EQ(LIBC_NAMESPACE::tolower('B'), int('b'));
17-
EXPECT_EQ(LIBC_NAMESPACE::tolower('3'), int('3'));
18-
19-
EXPECT_EQ(LIBC_NAMESPACE::tolower(' '), int(' '));
20-
EXPECT_EQ(LIBC_NAMESPACE::tolower('?'), int('?'));
21-
EXPECT_EQ(LIBC_NAMESPACE::tolower('\0'), int('\0'));
22-
EXPECT_EQ(LIBC_NAMESPACE::tolower(-1), int(-1));
23-
}
14+
namespace {
2415

2516
// TODO: Merge the ctype tests using this framework.
2617
// Invariant: UPPER_ARR and LOWER_ARR are both the complete alphabet in the same
@@ -45,6 +36,19 @@ int span_index(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
4536
return -1;
4637
}
4738

39+
} // namespace
40+
41+
TEST(LlvmLibcToLower, SimpleTest) {
42+
EXPECT_EQ(LIBC_NAMESPACE::tolower('a'), int('a'));
43+
EXPECT_EQ(LIBC_NAMESPACE::tolower('B'), int('b'));
44+
EXPECT_EQ(LIBC_NAMESPACE::tolower('3'), int('3'));
45+
46+
EXPECT_EQ(LIBC_NAMESPACE::tolower(' '), int(' '));
47+
EXPECT_EQ(LIBC_NAMESPACE::tolower('?'), int('?'));
48+
EXPECT_EQ(LIBC_NAMESPACE::tolower('\0'), int('\0'));
49+
EXPECT_EQ(LIBC_NAMESPACE::tolower(-1), int(-1));
50+
}
51+
4852
TEST(LlvmLibcToLower, DefaultLocale) {
4953
for (int ch = -255; ch < 255; ++ch) {
5054
int char_index = span_index(ch, UPPER_ARR);

libc/test/src/ctype/toupper_test.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,7 @@
1111

1212
#include "test/UnitTest/Test.h"
1313

14-
TEST(LlvmLibcToUpper, SimpleTest) {
15-
EXPECT_EQ(LIBC_NAMESPACE::toupper('a'), int('A'));
16-
EXPECT_EQ(LIBC_NAMESPACE::toupper('B'), int('B'));
17-
EXPECT_EQ(LIBC_NAMESPACE::toupper('3'), int('3'));
18-
19-
EXPECT_EQ(LIBC_NAMESPACE::toupper(' '), int(' '));
20-
EXPECT_EQ(LIBC_NAMESPACE::toupper('?'), int('?'));
21-
EXPECT_EQ(LIBC_NAMESPACE::toupper('\0'), int('\0'));
22-
EXPECT_EQ(LIBC_NAMESPACE::toupper(-1), int(-1));
23-
}
14+
namespace {
2415

2516
// TODO: Merge the ctype tests using this framework.
2617
// Invariant: UPPER_ARR and LOWER_ARR are both the complete alphabet in the same
@@ -45,6 +36,19 @@ int span_index(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
4536
return -1;
4637
}
4738

39+
} // namespace
40+
41+
TEST(LlvmLibcToUpper, SimpleTest) {
42+
EXPECT_EQ(LIBC_NAMESPACE::toupper('a'), int('A'));
43+
EXPECT_EQ(LIBC_NAMESPACE::toupper('B'), int('B'));
44+
EXPECT_EQ(LIBC_NAMESPACE::toupper('3'), int('3'));
45+
46+
EXPECT_EQ(LIBC_NAMESPACE::toupper(' '), int(' '));
47+
EXPECT_EQ(LIBC_NAMESPACE::toupper('?'), int('?'));
48+
EXPECT_EQ(LIBC_NAMESPACE::toupper('\0'), int('\0'));
49+
EXPECT_EQ(LIBC_NAMESPACE::toupper(-1), int(-1));
50+
}
51+
4852
TEST(LlvmLibcToUpper, DefaultLocale) {
4953
for (int ch = -255; ch < 255; ++ch) {
5054
int char_index = span_index(ch, LOWER_ARR);

0 commit comments

Comments
 (0)