Skip to content

Commit 1c6f2a0

Browse files
committed
[clang][test] add TestLanguage.def to specify all tested language versions
Adds a def file to have a single location where tested language versions are specified. Removes the need to update multiple locations in the testing infrastructure to add a new language version to be tested. Test instatiation can now include all languages without needing to specify them. This patch also adds pretty printing for instantiated test names. That means, that a test instantiated with C++23 will have the name `...TestSuite/TestName/CXX23` instead ending with some number (index of the argument for instantiation of the test), which improves a better experience when encountering a test failure with a specific language version. The suffix will also contain an `_win` if the target contains `win`.
1 parent b301a98 commit 1c6f2a0

File tree

12 files changed

+280
-149
lines changed

12 files changed

+280
-149
lines changed

clang/include/clang/Testing/CommandLineArgs.h

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,18 @@
2121
namespace clang {
2222

2323
enum TestLanguage {
24-
Lang_C89,
25-
Lang_C99,
26-
Lang_CXX03,
27-
Lang_CXX11,
28-
Lang_CXX14,
29-
Lang_CXX17,
30-
Lang_CXX20,
31-
Lang_CXX23,
24+
#define TESTLANGUAGE(lang, version, std_flag, version_index) \
25+
Lang_##lang##version,
26+
#include "clang/Testing/TestLanguage.def"
27+
3228
Lang_OpenCL,
3329
Lang_OBJC,
34-
Lang_OBJCXX
30+
Lang_OBJCXX,
3531
};
3632

33+
std::vector<TestLanguage> getCOrLater(int MinimumStd);
34+
std::vector<TestLanguage> getCXXOrLater(int MinimumStd);
35+
3736
std::vector<std::string> getCommandLineArgsForTesting(TestLanguage Lang);
3837
std::vector<std::string> getCC1ArgsForTesting(TestLanguage Lang);
3938

clang/include/clang/Testing/TestClangConfig.h

Lines changed: 125 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,37 +27,117 @@ struct TestClangConfig {
2727
/// The argument of the `-target` command line flag.
2828
std::string Target;
2929

30-
bool isC() const { return Language == Lang_C89 || Language == Lang_C99; }
31-
32-
bool isC99OrLater() const { return Language == Lang_C99; }
33-
34-
bool isCXX() const {
35-
return Language == Lang_CXX03 || Language == Lang_CXX11 ||
36-
Language == Lang_CXX14 || Language == Lang_CXX17 ||
37-
Language == Lang_CXX20 || Language == Lang_CXX23;
30+
bool isC() const {
31+
return false
32+
#define TESTLANGUAGE
33+
#define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
34+
|| Language == Lang_##lang##version
35+
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index)
36+
#include "clang/Testing/TestLanguage.def"
37+
;
3838
}
3939

40-
bool isCXX11OrLater() const {
41-
return Language == Lang_CXX11 || Language == Lang_CXX14 ||
42-
Language == Lang_CXX17 || Language == Lang_CXX20 ||
43-
Language == Lang_CXX23;
40+
bool isCOrLater(int MinimumStdVersion) const {
41+
const auto MinimumStdVersionIndex = 0
42+
#define TESTLANGUAGE
43+
#define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
44+
+(MinimumStdVersion == version ? version_index : 0)
45+
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index)
46+
#include "clang/Testing/TestLanguage.def"
47+
;
48+
switch (Language) {
49+
#define TESTLANGUAGE
50+
#define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
51+
case Lang_##lang##version: \
52+
return MinimumStdVersionIndex <= version_index;
53+
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index)
54+
#include "clang/Testing/TestLanguage.def"
55+
default:
56+
return false;
57+
}
4458
}
4559

46-
bool isCXX14OrLater() const {
47-
return Language == Lang_CXX14 || Language == Lang_CXX17 ||
48-
Language == Lang_CXX20 || Language == Lang_CXX23;
60+
bool isC99OrLater() const { return isCOrLater(99); }
61+
62+
bool isCOrEarlier(int MaximumStdVersion) const {
63+
const auto MaximumStdVersionIndex = 0
64+
#define TESTLANGUAGE
65+
#define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
66+
+(MaximumStdVersion == version ? version_index : 0)
67+
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index)
68+
#include "clang/Testing/TestLanguage.def"
69+
;
70+
switch (Language) {
71+
#define TESTLANGUAGE
72+
#define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
73+
case Lang_##lang##version: \
74+
return MaximumStdVersionIndex >= version_index;
75+
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index)
76+
#include "clang/Testing/TestLanguage.def"
77+
default:
78+
return false;
79+
}
4980
}
5081

51-
bool isCXX17OrLater() const {
52-
return Language == Lang_CXX17 || Language == Lang_CXX20 ||
53-
Language == Lang_CXX23;
82+
bool isCXX() const {
83+
return false
84+
#define TESTLANGUAGE
85+
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
86+
|| Language == Lang_##lang##version
87+
#define TESTLANGUAGE_C(lang, version, std_flag, version_index)
88+
#include "clang/Testing/TestLanguage.def"
89+
;
5490
}
5591

56-
bool isCXX20OrLater() const {
57-
return Language == Lang_CXX20 || Language == Lang_CXX23;
92+
bool isCXXOrLater(int MinimumStdVersion) const {
93+
const auto MinimumStdVersionIndex = 0
94+
#define TESTLANGUAGE
95+
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
96+
+(MinimumStdVersion == version ? version_index : 0)
97+
#define TESTLANGUAGE_C(lang, version, std_flag, version_index)
98+
#include "clang/Testing/TestLanguage.def"
99+
;
100+
switch (Language) {
101+
#define TESTLANGUAGE
102+
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
103+
case Lang_##lang##version: \
104+
return MinimumStdVersionIndex <= version_index;
105+
#define TESTLANGUAGE_C(lang, version, std_flag, version_index)
106+
#include "clang/Testing/TestLanguage.def"
107+
default:
108+
return false;
109+
}
58110
}
59111

60-
bool isCXX23OrLater() const { return Language == Lang_CXX23; }
112+
bool isCXX11OrLater() const { return isCXXOrLater(11); }
113+
114+
bool isCXX14OrLater() const { return isCXXOrLater(14); }
115+
116+
bool isCXX17OrLater() const { return isCXXOrLater(17); }
117+
118+
bool isCXX20OrLater() const { return isCXXOrLater(20); }
119+
120+
bool isCXX23OrLater() const { return isCXXOrLater(23); }
121+
122+
bool isCXXOrEarlier(int MaximumStdVersion) const {
123+
const auto MaximumStdVersionIndex = 0
124+
#define TESTLANGUAGE
125+
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
126+
+(MaximumStdVersion == version ? version_index : 0)
127+
#define TESTLANGUAGE_C(lang, version, std_flag, version_index)
128+
#include "clang/Testing/TestLanguage.def"
129+
;
130+
switch (Language) {
131+
#define TESTLANGUAGE
132+
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
133+
case Lang_##lang##version: \
134+
return MaximumStdVersionIndex >= version_index;
135+
#define TESTLANGUAGE_C(lang, version, std_flag, version_index)
136+
#include "clang/Testing/TestLanguage.def"
137+
default:
138+
return false;
139+
}
140+
}
61141

62142
bool supportsCXXDynamicExceptionSpecification() const {
63143
return Language == Lang_CXX03 || Language == Lang_CXX11 ||
@@ -75,6 +155,30 @@ struct TestClangConfig {
75155
return Result;
76156
}
77157

158+
std::string toShortString() const {
159+
std::string Result;
160+
llvm::raw_string_ostream OS(Result);
161+
switch (Language) {
162+
#define TESTLANGUAGE(lang, version, std_flag, version_index) \
163+
case Lang_##lang##version: \
164+
OS << (#lang #version); \
165+
break;
166+
#include "clang/Testing/TestLanguage.def"
167+
case Lang_OpenCL:
168+
OS << "OpenCL";
169+
break;
170+
case Lang_OBJC:
171+
OS << "OBJC";
172+
break;
173+
case Lang_OBJCXX:
174+
OS << "OBJCXX";
175+
break;
176+
}
177+
178+
OS << (Target.find("win") != std::string::npos ? "_win" : "");
179+
return Result;
180+
}
181+
78182
std::string toString() const {
79183
std::string Result;
80184
llvm::raw_string_ostream OS(Result);
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
2+
//===-- TestLanguage.def - Language Versions for Testing --------*- C++ -*-===//
3+
//
4+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5+
// See https://llvm.org/LICENSE.txt for license information.
6+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
//
8+
//===----------------------------------------------------------------------===//
9+
10+
#ifndef TESTLANGUAGE
11+
#error "TESTLANGUAGE must be defined before including this file"
12+
#endif
13+
14+
#ifndef TESTLANGUAGE_C
15+
#define TESTLANGUAGE_C TESTLANGUAGE
16+
#endif
17+
18+
#ifndef TESTLANGUAGE_CXX
19+
#define TESTLANGUAGE_CXX TESTLANGUAGE
20+
#endif
21+
22+
TESTLANGUAGE_C(C, 89, c89, 0)
23+
TESTLANGUAGE_C(C, 99, c99, 1)
24+
TESTLANGUAGE_C(C, 11, c11, 2)
25+
TESTLANGUAGE_C(C, 17, c17, 3)
26+
TESTLANGUAGE_C(C, 23, c23, 4)
27+
28+
// TESTLANGUAGE_CXX(CXX, 98, c++98, 0)
29+
TESTLANGUAGE_CXX(CXX, 03, c++03, 1)
30+
TESTLANGUAGE_CXX(CXX, 11, c++11, 2)
31+
TESTLANGUAGE_CXX(CXX, 14, c++14, 3)
32+
TESTLANGUAGE_CXX(CXX, 17, c++17, 4)
33+
TESTLANGUAGE_CXX(CXX, 20, c++20, 5)
34+
TESTLANGUAGE_CXX(CXX, 23, c++23, 6)
35+
TESTLANGUAGE_CXX(CXX, 26, c++26, 7)
36+
37+
#undef TESTLANGUAGE_CXX
38+
#undef TESTLANGUAGE_C
39+
#undef TESTLANGUAGE

clang/lib/Testing/CommandLineArgs.cpp

Lines changed: 52 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -11,99 +11,84 @@
1111
#include "llvm/Support/ErrorHandling.h"
1212

1313
namespace clang {
14+
std::vector<TestLanguage> getCOrLater(const int MinimumStd) {
15+
std::vector<TestLanguage> Result{};
16+
17+
#define TESTLANGUAGE(lang, version, std_flag, version_index)
18+
#define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
19+
if (version >= MinimumStd) \
20+
Result.push_back(Lang_##lang##version);
21+
#include "clang/Testing/TestLanguage.def"
22+
23+
return Result;
24+
}
25+
std::vector<TestLanguage> getCXXOrLater(const int MinimumStd) {
26+
std::vector<TestLanguage> Result{};
27+
28+
#define TESTLANGUAGE(lang, version, std_flag, version_index)
29+
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
30+
if (version >= MinimumStd) \
31+
Result.push_back(Lang_##lang##version);
32+
#include "clang/Testing/TestLanguage.def"
33+
34+
return Result;
35+
}
1436

1537
std::vector<std::string> getCommandLineArgsForTesting(TestLanguage Lang) {
16-
std::vector<std::string> Args;
1738
// Test with basic arguments.
1839
switch (Lang) {
19-
case Lang_C89:
20-
Args = {"-x", "c", "-std=c89"};
21-
break;
22-
case Lang_C99:
23-
Args = {"-x", "c", "-std=c99"};
24-
break;
25-
case Lang_CXX03:
26-
Args = {"-std=c++03", "-frtti"};
27-
break;
28-
case Lang_CXX11:
29-
Args = {"-std=c++11", "-frtti"};
30-
break;
31-
case Lang_CXX14:
32-
Args = {"-std=c++14", "-frtti"};
33-
break;
34-
case Lang_CXX17:
35-
Args = {"-std=c++17", "-frtti"};
36-
break;
37-
case Lang_CXX20:
38-
Args = {"-std=c++20", "-frtti"};
39-
break;
40-
case Lang_CXX23:
41-
Args = {"-std=c++23", "-frtti"};
42-
break;
40+
#define TESTLANGUAGE
41+
#define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
42+
case Lang_##lang##version: \
43+
return { "-x", "c", "-std=" #std_flag };
44+
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
45+
case Lang_##lang##version: \
46+
return { "-std=" #std_flag, "-frtti" };
47+
#include "clang/Testing/TestLanguage.def"
48+
4349
case Lang_OBJC:
44-
Args = {"-x", "objective-c", "-frtti", "-fobjc-nonfragile-abi"};
45-
break;
50+
return {"-x", "objective-c", "-frtti", "-fobjc-nonfragile-abi"};
4651
case Lang_OBJCXX:
47-
Args = {"-x", "objective-c++", "-frtti"};
48-
break;
52+
return {"-x", "objective-c++", "-frtti"};
4953
case Lang_OpenCL:
5054
llvm_unreachable("Not implemented yet!");
5155
}
52-
return Args;
56+
llvm_unreachable("Not implemented yet!");
5357
}
5458

5559
std::vector<std::string> getCC1ArgsForTesting(TestLanguage Lang) {
56-
std::vector<std::string> Args;
5760
switch (Lang) {
58-
case Lang_C89:
59-
Args = {"-xc", "-std=c89"};
60-
break;
61-
case Lang_C99:
62-
Args = {"-xc", "-std=c99"};
63-
break;
64-
case Lang_CXX03:
65-
Args = {"-std=c++03"};
66-
break;
67-
case Lang_CXX11:
68-
Args = {"-std=c++11"};
69-
break;
70-
case Lang_CXX14:
71-
Args = {"-std=c++14"};
72-
break;
73-
case Lang_CXX17:
74-
Args = {"-std=c++17"};
75-
break;
76-
case Lang_CXX20:
77-
Args = {"-std=c++20"};
78-
break;
79-
case Lang_CXX23:
80-
Args = {"-std=c++23"};
81-
break;
61+
#define TESTLANGUAGE
62+
#define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
63+
case Lang_##lang##version: \
64+
return { "-xc", "-std=" #std_flag };
65+
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
66+
case Lang_##lang##version: \
67+
return { "-std=" #std_flag };
68+
#include "clang/Testing/TestLanguage.def"
69+
8270
case Lang_OBJC:
83-
Args = {"-xobjective-c"};
71+
return {"-xobjective-c"};
8472
break;
8573
case Lang_OBJCXX:
86-
Args = {"-xobjective-c++"};
74+
return {"-xobjective-c++"};
8775
break;
8876
case Lang_OpenCL:
8977
llvm_unreachable("Not implemented yet!");
9078
}
91-
return Args;
79+
llvm_unreachable("Not implemented yet!");
9280
}
9381

9482
StringRef getFilenameForTesting(TestLanguage Lang) {
9583
switch (Lang) {
96-
case Lang_C89:
97-
case Lang_C99:
84+
#define TESTLANGUAGE
85+
#define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
86+
case Lang_##lang##version: \
9887
return "input.c";
99-
100-
case Lang_CXX03:
101-
case Lang_CXX11:
102-
case Lang_CXX14:
103-
case Lang_CXX17:
104-
case Lang_CXX20:
105-
case Lang_CXX23:
88+
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
89+
case Lang_##lang##version: \
10690
return "input.cc";
91+
#include "clang/Testing/TestLanguage.def"
10792

10893
case Lang_OpenCL:
10994
return "input.cl";

0 commit comments

Comments
 (0)