Skip to content

[clang][test] add TestLanguage.def to specify all tested language versions #94243

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 8 additions & 9 deletions clang/include/clang/Testing/CommandLineArgs.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,18 @@
namespace clang {

enum TestLanguage {
Lang_C89,
Lang_C99,
Lang_CXX03,
Lang_CXX11,
Lang_CXX14,
Lang_CXX17,
Lang_CXX20,
Lang_CXX23,
#define TESTLANGUAGE(lang, version, std_flag, version_index) \
Lang_##lang##version,
#include "clang/Testing/TestLanguage.def"

Lang_OpenCL,
Lang_OBJC,
Lang_OBJCXX
Lang_OBJCXX,
};

std::vector<TestLanguage> getCOrLater(int MinimumStd);
std::vector<TestLanguage> getCXXOrLater(int MinimumStd);

std::vector<std::string> getCommandLineArgsForTesting(TestLanguage Lang);
std::vector<std::string> getCC1ArgsForTesting(TestLanguage Lang);

Expand Down
115 changes: 96 additions & 19 deletions clang/include/clang/Testing/TestClangConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,37 +27,90 @@ struct TestClangConfig {
/// The argument of the `-target` command line flag.
std::string Target;

bool isC() const { return Language == Lang_C89 || Language == Lang_C99; }
bool isC() const {
return false
#define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
|| Language == Lang_##lang##version
#include "clang/Testing/TestLanguage.def"
;
}

bool isC99OrLater() const { return Language == Lang_C99; }
bool isC(int Version) const {
return false
#define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
|| (Version == version && Language == Lang_##lang##version)
#include "clang/Testing/TestLanguage.def"
;
}

bool isCXX() const {
return Language == Lang_CXX03 || Language == Lang_CXX11 ||
Language == Lang_CXX14 || Language == Lang_CXX17 ||
Language == Lang_CXX20 || Language == Lang_CXX23;
bool isCOrLater(int MinimumStdVersion) const {
const auto MinimumStdVersionIndex = 0
#define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
+(MinimumStdVersion == version ? version_index : 0)
#include "clang/Testing/TestLanguage.def"
;
switch (Language) {
#define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
case Lang_##lang##version: \
return MinimumStdVersionIndex <= version_index;
#include "clang/Testing/TestLanguage.def"
default:
return false;
}
}

bool isCXX11OrLater() const {
return Language == Lang_CXX11 || Language == Lang_CXX14 ||
Language == Lang_CXX17 || Language == Lang_CXX20 ||
Language == Lang_CXX23;
bool isC99OrLater() const { return isCOrLater(99); }

bool isCOrEarlier(int MaximumStdVersion) const {
return isC() && (isC(MaximumStdVersion) || !isCOrLater(MaximumStdVersion));
}

bool isCXX14OrLater() const {
return Language == Lang_CXX14 || Language == Lang_CXX17 ||
Language == Lang_CXX20 || Language == Lang_CXX23;
bool isCXX() const {
return false
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
|| Language == Lang_##lang##version
#include "clang/Testing/TestLanguage.def"
;
}

bool isCXX17OrLater() const {
return Language == Lang_CXX17 || Language == Lang_CXX20 ||
Language == Lang_CXX23;
bool isCXX(int Version) const {
return false
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
|| (Version == version && Language == Lang_##lang##version)
#include "clang/Testing/TestLanguage.def"
;
}

bool isCXX20OrLater() const {
return Language == Lang_CXX20 || Language == Lang_CXX23;
bool isCXXOrLater(int MinimumStdVersion) const {
const auto MinimumStdVersionIndex = 0
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
+(MinimumStdVersion == version ? version_index : 0)
#include "clang/Testing/TestLanguage.def"
;
switch (Language) {
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
case Lang_##lang##version: \
return MinimumStdVersionIndex <= version_index;
#include "clang/Testing/TestLanguage.def"
default:
return false;
}
}

bool isCXX23OrLater() const { return Language == Lang_CXX23; }
bool isCXX11OrLater() const { return isCXXOrLater(11); }

bool isCXX14OrLater() const { return isCXXOrLater(14); }

bool isCXX17OrLater() const { return isCXXOrLater(17); }

bool isCXX20OrLater() const { return isCXXOrLater(20); }

bool isCXX23OrLater() const { return isCXXOrLater(23); }

bool isCXXOrEarlier(int MaximumStdVersion) const {
return isCXX() &&
(isCXX(MaximumStdVersion) || !isCXXOrLater(MaximumStdVersion));
}

bool supportsCXXDynamicExceptionSpecification() const {
return Language == Lang_CXX03 || Language == Lang_CXX11 ||
Expand All @@ -75,6 +128,30 @@ struct TestClangConfig {
return Result;
}

std::string toShortString() const {
std::string Result;
llvm::raw_string_ostream OS(Result);
switch (Language) {
#define TESTLANGUAGE(lang, version, std_flag, version_index) \
case Lang_##lang##version: \
OS << (#lang #version); \
break;
#include "clang/Testing/TestLanguage.def"
case Lang_OpenCL:
OS << "OpenCL";
break;
case Lang_OBJC:
OS << "OBJC";
break;
case Lang_OBJCXX:
OS << "OBJCXX";
break;
}

OS << (Target.find("win") != std::string::npos ? "_win" : "");
return Result;
}

std::string toString() const {
std::string Result;
llvm::raw_string_ostream OS(Result);
Expand Down
47 changes: 47 additions & 0 deletions clang/include/clang/Testing/TestLanguage.def
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@

//===-- TestLanguage.def - Language Versions for Testing --------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// The TESTLANGUAGE(-C/-CXX) macros have four parameters:
// the language, the standard version, the corresponding compile-flag,
// and an index of the language version for each language.
// The standard version is used to compare a standard version numerically,
// and the index is used to impose ordering for the language versions
// with respect to each language.

#ifndef TESTLANGUAGE
# define TESTLANGUAGE(...)
#endif

#ifndef TESTLANGUAGE_C
# define TESTLANGUAGE_C(...) TESTLANGUAGE(__VA_ARGS__)
#endif

#ifndef TESTLANGUAGE_CXX
# define TESTLANGUAGE_CXX(...) TESTLANGUAGE(__VA_ARGS__)
#endif

TESTLANGUAGE_C(C, 89, c89, 0)
TESTLANGUAGE_C(C, 99, c99, 1)
TESTLANGUAGE_C(C, 11, c11, 2)
TESTLANGUAGE_C(C, 17, c17, 3)
TESTLANGUAGE_C(C, 23, c23, 4)
TESTLANGUAGE_C(C, 26, c2y, 5)

// TESTLANGUAGE_CXX(CXX, 98, c++98, 0)
TESTLANGUAGE_CXX(CXX, 03, c++03, 1)
TESTLANGUAGE_CXX(CXX, 11, c++11, 2)
TESTLANGUAGE_CXX(CXX, 14, c++14, 3)
TESTLANGUAGE_CXX(CXX, 17, c++17, 4)
TESTLANGUAGE_CXX(CXX, 20, c++20, 5)
TESTLANGUAGE_CXX(CXX, 23, c++23, 6)
TESTLANGUAGE_CXX(CXX, 26, c++26, 7)

#undef TESTLANGUAGE_CXX
#undef TESTLANGUAGE_C
#undef TESTLANGUAGE
118 changes: 49 additions & 69 deletions clang/lib/Testing/CommandLineArgs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,99 +11,79 @@
#include "llvm/Support/ErrorHandling.h"

namespace clang {
std::vector<TestLanguage> getCOrLater(const int MinimumStd) {
std::vector<TestLanguage> Result{};

#define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
if (version >= MinimumStd) \
Result.push_back(Lang_##lang##version);
#include "clang/Testing/TestLanguage.def"

return Result;
}
std::vector<TestLanguage> getCXXOrLater(const int MinimumStd) {
std::vector<TestLanguage> Result{};

#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
if (version >= MinimumStd) \
Result.push_back(Lang_##lang##version);
#include "clang/Testing/TestLanguage.def"

return Result;
}

std::vector<std::string> getCommandLineArgsForTesting(TestLanguage Lang) {
std::vector<std::string> Args;
// Test with basic arguments.
switch (Lang) {
case Lang_C89:
Args = {"-x", "c", "-std=c89"};
break;
case Lang_C99:
Args = {"-x", "c", "-std=c99"};
break;
case Lang_CXX03:
Args = {"-std=c++03", "-frtti"};
break;
case Lang_CXX11:
Args = {"-std=c++11", "-frtti"};
break;
case Lang_CXX14:
Args = {"-std=c++14", "-frtti"};
break;
case Lang_CXX17:
Args = {"-std=c++17", "-frtti"};
break;
case Lang_CXX20:
Args = {"-std=c++20", "-frtti"};
break;
case Lang_CXX23:
Args = {"-std=c++23", "-frtti"};
break;
#define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
case Lang_##lang##version: \
return { "-x", "c", "-std=" #std_flag };
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
case Lang_##lang##version: \
return { "-std=" #std_flag, "-frtti" };
#include "clang/Testing/TestLanguage.def"

case Lang_OBJC:
Args = {"-x", "objective-c", "-frtti", "-fobjc-nonfragile-abi"};
break;
return {"-x", "objective-c", "-frtti", "-fobjc-nonfragile-abi"};
case Lang_OBJCXX:
Args = {"-x", "objective-c++", "-frtti"};
break;
return {"-x", "objective-c++", "-frtti"};
case Lang_OpenCL:
llvm_unreachable("Not implemented yet!");
llvm_unreachable("Unhandled TestLanguage enum");
}
return Args;
llvm_unreachable("Unhandled TestLanguage enum");
}

std::vector<std::string> getCC1ArgsForTesting(TestLanguage Lang) {
std::vector<std::string> Args;
switch (Lang) {
case Lang_C89:
Args = {"-xc", "-std=c89"};
break;
case Lang_C99:
Args = {"-xc", "-std=c99"};
break;
case Lang_CXX03:
Args = {"-std=c++03"};
break;
case Lang_CXX11:
Args = {"-std=c++11"};
break;
case Lang_CXX14:
Args = {"-std=c++14"};
break;
case Lang_CXX17:
Args = {"-std=c++17"};
break;
case Lang_CXX20:
Args = {"-std=c++20"};
break;
case Lang_CXX23:
Args = {"-std=c++23"};
break;
#define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
case Lang_##lang##version: \
return { "-xc", "-std=" #std_flag };
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
case Lang_##lang##version: \
return { "-std=" #std_flag };
#include "clang/Testing/TestLanguage.def"

case Lang_OBJC:
Args = {"-xobjective-c"};
return {"-xobjective-c"};
break;
case Lang_OBJCXX:
Args = {"-xobjective-c++"};
return {"-xobjective-c++"};
break;
case Lang_OpenCL:
llvm_unreachable("Not implemented yet!");
llvm_unreachable("Unhandled TestLanguage enum");
}
return Args;
llvm_unreachable("Unhandled TestLanguage enum");
}

StringRef getFilenameForTesting(TestLanguage Lang) {
switch (Lang) {
case Lang_C89:
case Lang_C99:
#define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
case Lang_##lang##version: \
return "input.c";

case Lang_CXX03:
case Lang_CXX11:
case Lang_CXX14:
case Lang_CXX17:
case Lang_CXX20:
case Lang_CXX23:
#define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
case Lang_##lang##version: \
return "input.cc";
#include "clang/Testing/TestLanguage.def"

case Lang_OpenCL:
return "input.cl";
Expand Down
Loading
Loading