diff --git a/clang/lib/Tooling/Syntax/BuildTree.cpp b/clang/lib/Tooling/Syntax/BuildTree.cpp --- a/clang/lib/Tooling/Syntax/BuildTree.cpp +++ b/clang/lib/Tooling/Syntax/BuildTree.cpp @@ -1044,7 +1044,12 @@ if (!Child) return; - syntax::Tree *ChildNode = Mapping.find(Child); + syntax::Tree *ChildNode; + if (Expr *ChildExpr = dyn_cast(Child)) { + ChildNode = Mapping.find(ChildExpr->IgnoreImplicit()); + } else { + ChildNode = Mapping.find(Child); + } assert(ChildNode != nullptr); // This is an expression in a statement position, consume the trailing diff --git a/clang/unittests/Tooling/Syntax/TreeTest.cpp b/clang/unittests/Tooling/Syntax/TreeTest.cpp --- a/clang/unittests/Tooling/Syntax/TreeTest.cpp +++ b/clang/unittests/Tooling/Syntax/TreeTest.cpp @@ -705,20 +705,16 @@ } TEST_P(SyntaxTreeTest, PrefixUnaryOperator) { - if (!GetParam().isCXX()) { - // TODO: Split parts that depend on C++ into a separate test. - return; - } expectTreeDumpEqual( R"cpp( -void test(int a, int *ap, bool b) { +void test(int a, int *ap) { --a; ++a; - ~a; compl a; + ~a; -a; +a; &a; *ap; - !b; not b; + !a; __real a; __imag a; } )cpp", @@ -740,11 +736,6 @@ | | `-SimpleDeclarator | | |-* | | `-ap - | |-, - | |-SimpleDeclaration - | | |-bool - | | `-SimpleDeclarator - | | `-b | `-) `-CompoundStatement |-{ @@ -768,12 +759,6 @@ | `-; |-ExpressionStatement | |-PrefixUnaryOperatorExpression - | | |-compl - | | `-UnknownExpression - | | `-a - | `-; - |-ExpressionStatement - | |-PrefixUnaryOperatorExpression | | |-- | | `-UnknownExpression | | `-a @@ -800,26 +785,67 @@ | |-PrefixUnaryOperatorExpression | | |-! | | `-UnknownExpression - | | `-b + | | `-a | `-; |-ExpressionStatement | |-PrefixUnaryOperatorExpression - | | |-not + | | |-__real | | `-UnknownExpression - | | `-b + | | `-a | `-; |-ExpressionStatement | |-PrefixUnaryOperatorExpression - | | |-__real + | | |-__imag | | `-UnknownExpression | | `-a | `-; + `-} +)txt"); +} + +TEST_P(SyntaxTreeTest, PrefixUnaryOperatorCxx) { + if (!GetParam().isCXX()) { + return; + } + expectTreeDumpEqual( + R"cpp( +void test(int a, bool b) { + compl a; + not b; +} + )cpp", + R"txt( +*: TranslationUnit +`-SimpleDeclaration + |-void + |-SimpleDeclarator + | |-test + | `-ParametersAndQualifiers + | |-( + | |-SimpleDeclaration + | | |-int + | | `-SimpleDeclarator + | | `-a + | |-, + | |-SimpleDeclaration + | | |-bool + | | `-SimpleDeclarator + | | `-b + | `-) + `-CompoundStatement + |-{ |-ExpressionStatement | |-PrefixUnaryOperatorExpression - | | |-__imag + | | |-compl | | `-UnknownExpression | | `-a | `-; + |-ExpressionStatement + | |-PrefixUnaryOperatorExpression + | | |-not + | | `-UnknownExpression + | | `-b + | `-; `-} )txt"); }