421 changes: 370 additions & 51 deletions clang/unittests/Tooling/Syntax/TreeTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ struct TestClangConfig {

bool isC99OrLater() const { return Language == Lang_C99; }

bool isC() const { return Language == Lang_C89 || Language == Lang_C99; }

bool isCXX() const {
return Language == Lang_CXX03 || Language == Lang_CXX11 ||
Language == Lang_CXX14 || Language == Lang_CXX17 ||
Expand All @@ -69,8 +71,8 @@ struct TestClangConfig {
Language == Lang_CXX20;
}

bool hasBoolType() const {
return Language == Lang_C89 || Language == Lang_C99;
bool isCXX17OrLater() const {
return Language == Lang_CXX17 || Language == Lang_CXX20;
}

bool supportsCXXDynamicExceptionSpecification() const {
Expand Down Expand Up @@ -1203,14 +1205,66 @@ void test(S s) {
)txt"));
}

TEST_P(SyntaxTreeTest, CxxNullPtrLiteral) {
TEST_P(SyntaxTreeTest, IntegerLiteral) {
EXPECT_TRUE(treeDumpEqual(
R"cpp(
void test() {
12;
12u;
12l;
12ul;
014;
0XC;
}
)cpp",
R"txt(
*: TranslationUnit
`-SimpleDeclaration
|-void
|-SimpleDeclarator
| |-test
| `-ParametersAndQualifiers
| |-(
| `-)
`-CompoundStatement
|-{
|-ExpressionStatement
| |-IntegerLiteralExpression
| | `-12
| `-;
|-ExpressionStatement
| |-IntegerLiteralExpression
| | `-12u
| `-;
|-ExpressionStatement
| |-IntegerLiteralExpression
| | `-12l
| `-;
|-ExpressionStatement
| |-IntegerLiteralExpression
| | `-12ul
| `-;
|-ExpressionStatement
| |-IntegerLiteralExpression
| | `-014
| `-;
|-ExpressionStatement
| |-IntegerLiteralExpression
| | `-0XC
| `-;
`-}
)txt"));
}

TEST_P(SyntaxTreeTest, IntegerLiteralLongLong) {
if (!GetParam().isCXX11OrLater()) {
return;
}
EXPECT_TRUE(treeDumpEqual(
R"cpp(
void test() {
nullptr;
12ll;
12ull;
}
)cpp",
R"txt(
Expand All @@ -1225,22 +1279,25 @@ void test() {
`-CompoundStatement
|-{
|-ExpressionStatement
| |-CxxNullPtrExpression
| | `-nullptr
| |-IntegerLiteralExpression
| | `-12ll
| `-;
|-ExpressionStatement
| |-IntegerLiteralExpression
| | `-12ull
| `-;
`-}
)txt"));
}

TEST_P(SyntaxTreeTest, BoolLiteral) {
if (GetParam().hasBoolType()) {
TEST_P(SyntaxTreeTest, IntegerLiteralBinary) {
if (!GetParam().isCXX14OrLater()) {
return;
}
EXPECT_TRUE(treeDumpEqual(
R"cpp(
void test() {
true;
false;
0b1100;
}
)cpp",
R"txt(
Expand All @@ -1255,27 +1312,52 @@ void test() {
`-CompoundStatement
|-{
|-ExpressionStatement
| |-BoolLiteralExpression
| | `-true
| |-IntegerLiteralExpression
| | `-0b1100
| `-;
`-}
)txt"));
}

TEST_P(SyntaxTreeTest, IntegerLiteralWithDigitSeparators) {
if (!GetParam().isCXX14OrLater()) {
return;
}
EXPECT_TRUE(treeDumpEqual(
R"cpp(
void test() {
1'2'0ull;
}
)cpp",
R"txt(
*: TranslationUnit
`-SimpleDeclaration
|-void
|-SimpleDeclarator
| |-test
| `-ParametersAndQualifiers
| |-(
| `-)
`-CompoundStatement
|-{
|-ExpressionStatement
| |-BoolLiteralExpression
| | `-false
| |-IntegerLiteralExpression
| | `-1'2'0ull
| `-;
`-}
)txt"));
}

TEST_P(SyntaxTreeTest, IntegerLiteral) {
TEST_P(SyntaxTreeTest, CharacterLiteral) {
EXPECT_TRUE(treeDumpEqual(
R"cpp(
void test() {
12;
12u;
12l;
12ul;
014;
0XC;
'a';
'\n';
'\x20';
'\0';
L'a';
L'α';
}
)cpp",
R"txt(
Expand All @@ -1290,42 +1372,44 @@ void test() {
`-CompoundStatement
|-{
|-ExpressionStatement
| |-IntegerLiteralExpression
| | `-12
| |-CharacterLiteralExpression
| | `-'a'
| `-;
|-ExpressionStatement
| |-IntegerLiteralExpression
| | `-12u
| |-CharacterLiteralExpression
| | `-'\n'
| `-;
|-ExpressionStatement
| |-IntegerLiteralExpression
| | `-12l
| |-CharacterLiteralExpression
| | `-'\x20'
| `-;
|-ExpressionStatement
| |-IntegerLiteralExpression
| | `-12ul
| |-CharacterLiteralExpression
| | `-'\0'
| `-;
|-ExpressionStatement
| |-IntegerLiteralExpression
| | `-014
| |-CharacterLiteralExpression
| | `-L'a'
| `-;
|-ExpressionStatement
| |-IntegerLiteralExpression
| | `-0XC
| |-CharacterLiteralExpression
| | `-L'α'
| `-;
`-}
)txt"));
}

TEST_P(SyntaxTreeTest, IntegerLiteralLongLong) {
TEST_P(SyntaxTreeTest, CharacterLiteralUtf) {
if (!GetParam().isCXX11OrLater()) {
return;
}
EXPECT_TRUE(treeDumpEqual(
R"cpp(
void test() {
12ll;
12ull;
u'a';
u'æ§‹';
U'a';
U'🌲';
}
)cpp",
R"txt(
Expand All @@ -1340,25 +1424,34 @@ void test() {
`-CompoundStatement
|-{
|-ExpressionStatement
| |-IntegerLiteralExpression
| | `-12ll
| |-CharacterLiteralExpression
| | `-u'a'
| `-;
|-ExpressionStatement
| |-IntegerLiteralExpression
| | `-12ull
| |-CharacterLiteralExpression
| | `-u'æ§‹'
| `-;
|-ExpressionStatement
| |-CharacterLiteralExpression
| | `-U'a'
| `-;
|-ExpressionStatement
| |-CharacterLiteralExpression
| | `-U'🌲'
| `-;
`-}
)txt"));
}

TEST_P(SyntaxTreeTest, IntegerLiteralBinary) {
if (!GetParam().isCXX14OrLater()) {
TEST_P(SyntaxTreeTest, CharacterLiteralUtf8) {
if (!GetParam().isCXX17OrLater()) {
return;
}
EXPECT_TRUE(treeDumpEqual(
R"cpp(
void test() {
0b1100;
u8'a';
u8'\x7f';
}
)cpp",
R"txt(
Expand All @@ -1373,21 +1466,69 @@ void test() {
`-CompoundStatement
|-{
|-ExpressionStatement
| |-IntegerLiteralExpression
| | `-0b1100
| |-CharacterLiteralExpression
| | `-u8'a'
| `-;
|-ExpressionStatement
| |-CharacterLiteralExpression
| | `-u8'\x7f'
| `-;
`-}
)txt"));
}

TEST_P(SyntaxTreeTest, IntegerLiteralWithDigitSeparators) {
if (!GetParam().isCXX14OrLater()) {
TEST_P(SyntaxTreeTest, FloatingLiteral) {
EXPECT_TRUE(treeDumpEqual(
R"cpp(
void test() {
1e-2;
2.;
.2;
2.f;
}
)cpp",
R"txt(
*: TranslationUnit
`-SimpleDeclaration
|-void
|-SimpleDeclarator
| |-test
| `-ParametersAndQualifiers
| |-(
| `-)
`-CompoundStatement
|-{
|-ExpressionStatement
| |-FloatingLiteralExpression
| | `-1e-2
| `-;
|-ExpressionStatement
| |-FloatingLiteralExpression
| | `-2.
| `-;
|-ExpressionStatement
| |-FloatingLiteralExpression
| | `-.2
| `-;
|-ExpressionStatement
| |-FloatingLiteralExpression
| | `-2.f
| `-;
`-}
)txt"));
}

TEST_P(SyntaxTreeTest, FloatingLiteralHexadecimal) {
if (!GetParam().isCXX17OrLater()) {
return;
}
EXPECT_TRUE(treeDumpEqual(
R"cpp(
void test() {
1'2'0ull;
0xfp1;
0xf.p1;
0x.fp1;
0xf.fp1f;
}
)cpp",
R"txt(
Expand All @@ -1402,8 +1543,186 @@ void test() {
`-CompoundStatement
|-{
|-ExpressionStatement
| |-IntegerLiteralExpression
| | `-1'2'0ull
| |-FloatingLiteralExpression
| | `-0xfp1
| `-;
|-ExpressionStatement
| |-FloatingLiteralExpression
| | `-0xf.p1
| `-;
|-ExpressionStatement
| |-FloatingLiteralExpression
| | `-0x.fp1
| `-;
|-ExpressionStatement
| |-FloatingLiteralExpression
| | `-0xf.fp1f
| `-;
`-}
)txt"));
}

TEST_P(SyntaxTreeTest, StringLiteral) {
EXPECT_TRUE(treeDumpEqual(
R"cpp(
void test() {
"a\n\0\x20";
L"αβ";
}
)cpp",
R"txt(
*: TranslationUnit
`-SimpleDeclaration
|-void
|-SimpleDeclarator
| |-test
| `-ParametersAndQualifiers
| |-(
| `-)
`-CompoundStatement
|-{
|-ExpressionStatement
| |-StringLiteralExpression
| | `-"a\n\0\x20"
| `-;
|-ExpressionStatement
| |-StringLiteralExpression
| | `-L"αβ"
| `-;
`-}
)txt"));
}

TEST_P(SyntaxTreeTest, StringLiteralUtf) {
if (!GetParam().isCXX11OrLater()) {
return;
}
EXPECT_TRUE(treeDumpEqual(
R"cpp(
void test() {
u8"a\x1f\x05";
u"C++抽象構文木";
U"📖🌲\n";
}
)cpp",
R"txt(
*: TranslationUnit
`-SimpleDeclaration
|-void
|-SimpleDeclarator
| |-test
| `-ParametersAndQualifiers
| |-(
| `-)
`-CompoundStatement
|-{
|-ExpressionStatement
| |-StringLiteralExpression
| | `-u8"a\x1f\x05"
| `-;
|-ExpressionStatement
| |-StringLiteralExpression
| | `-u"C++抽象構文木"
| `-;
|-ExpressionStatement
| |-StringLiteralExpression
| | `-U"📖🌲\n"
| `-;
`-}
)txt"));
}

TEST_P(SyntaxTreeTest, StringLiteralRaw) {
if (!GetParam().isCXX11OrLater()) {
return;
}
EXPECT_TRUE(treeDumpEqual(
R"cpp(
void test() {
R"SyntaxTree(
Hello "Syntax" \"
)SyntaxTree";
}
)cpp",
R"txt(
*: TranslationUnit
`-SimpleDeclaration
|-void
|-SimpleDeclarator
| |-test
| `-ParametersAndQualifiers
| |-(
| `-)
`-CompoundStatement
|-{
|-ExpressionStatement
| |-StringLiteralExpression
| | `-R"SyntaxTree(
Hello "Syntax" \"
)SyntaxTree"
| `-;
`-}
)txt"));
}

TEST_P(SyntaxTreeTest, BoolLiteral) {
if (GetParam().isC()) {
return;
}
EXPECT_TRUE(treeDumpEqual(
R"cpp(
void test() {
true;
false;
}
)cpp",
R"txt(
*: TranslationUnit
`-SimpleDeclaration
|-void
|-SimpleDeclarator
| |-test
| `-ParametersAndQualifiers
| |-(
| `-)
`-CompoundStatement
|-{
|-ExpressionStatement
| |-BoolLiteralExpression
| | `-true
| `-;
|-ExpressionStatement
| |-BoolLiteralExpression
| | `-false
| `-;
`-}
)txt"));
}

TEST_P(SyntaxTreeTest, CxxNullPtrLiteral) {
if (!GetParam().isCXX11OrLater()) {
return;
}
EXPECT_TRUE(treeDumpEqual(
R"cpp(
void test() {
nullptr;
}
)cpp",
R"txt(
*: TranslationUnit
`-SimpleDeclaration
|-void
|-SimpleDeclarator
| |-test
| `-ParametersAndQualifiers
| |-(
| `-)
`-CompoundStatement
|-{
|-ExpressionStatement
| |-CxxNullPtrExpression
| | `-nullptr
| `-;
`-}
)txt"));
Expand Down Expand Up @@ -2597,7 +2916,7 @@ static_assert(true);
| |-BoolLiteralExpression
| | `-true
| |-,
| |-UnknownExpression
| |-StringLiteralExpression
| | `-"message"
| |-)
| `-;
Expand Down