diff options
author | Eduardo Caldas <ecaldas@google.com> | 2020-09-07 08:40:49 +0000 |
---|---|---|
committer | Eduardo Caldas <ecaldas@google.com> | 2020-09-08 09:44:23 +0000 |
commit | 134455a07c1f1de4cff62a6afb4ccd98b98343ec (patch) | |
tree | 9d37789efea35a3cdca5fecb0af7f28e1f265575 /clang/lib/Tooling/Syntax/BuildTree.cpp | |
parent | 46f4439dc9bf9b8cfee0001b6752c3d074c83b00 (diff) | |
download | llvm-134455a07c1f1de4cff62a6afb4ccd98b98343ec.zip llvm-134455a07c1f1de4cff62a6afb4ccd98b98343ec.tar.gz llvm-134455a07c1f1de4cff62a6afb4ccd98b98343ec.tar.bz2 |
[SyntaxTree] Ignore implicit `CXXFunctionalCastExpr` wrapping constructor
Differential Revision: https://reviews.llvm.org/D87229
Diffstat (limited to 'clang/lib/Tooling/Syntax/BuildTree.cpp')
-rw-r--r-- | clang/lib/Tooling/Syntax/BuildTree.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/clang/lib/Tooling/Syntax/BuildTree.cpp b/clang/lib/Tooling/Syntax/BuildTree.cpp index 72083ee..bb2b149 100644 --- a/clang/lib/Tooling/Syntax/BuildTree.cpp +++ b/clang/lib/Tooling/Syntax/BuildTree.cpp @@ -14,6 +14,7 @@ #include "clang/AST/Expr.h" #include "clang/AST/ExprCXX.h" #include "clang/AST/IgnoreExpr.h" +#include "clang/AST/OperationKinds.h" #include "clang/AST/RecursiveASTVisitor.h" #include "clang/AST/Stmt.h" #include "clang/AST/TypeLoc.h" @@ -60,9 +61,25 @@ static Expr *IgnoreImplicitConstructorSingleStep(Expr *E) { return E; } +// In: +// struct X { +// X(int) +// }; +// X x = X(1); +// Ignores the implicit `CXXFunctionalCastExpr` that wraps +// `CXXConstructExpr X(1)`. +static Expr *IgnoreCXXFunctionalCastExprWrappingConstructor(Expr *E) { + if (auto *F = dyn_cast<CXXFunctionalCastExpr>(E)) { + if (F->getCastKind() == CK_ConstructorConversion) + return F->getSubExpr(); + } + return E; +} + static Expr *IgnoreImplicit(Expr *E) { return IgnoreExprNodes(E, IgnoreImplicitSingleStep, - IgnoreImplicitConstructorSingleStep); + IgnoreImplicitConstructorSingleStep, + IgnoreCXXFunctionalCastExprWrappingConstructor); } LLVM_ATTRIBUTE_UNUSED |