[SyntaxTree] Ignore implicit `CXXFunctionalCastExpr` wrapping constructor

Differential Revision: https://reviews.llvm.org/D87229
This commit is contained in:
Eduardo Caldas 2020-09-07 08:40:49 +00:00
parent 46f4439dc9
commit 134455a07c
2 changed files with 23 additions and 8 deletions

View File

@ -14,6 +14,7 @@
#include "clang/AST/Expr.h" #include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h" #include "clang/AST/ExprCXX.h"
#include "clang/AST/IgnoreExpr.h" #include "clang/AST/IgnoreExpr.h"
#include "clang/AST/OperationKinds.h"
#include "clang/AST/RecursiveASTVisitor.h" #include "clang/AST/RecursiveASTVisitor.h"
#include "clang/AST/Stmt.h" #include "clang/AST/Stmt.h"
#include "clang/AST/TypeLoc.h" #include "clang/AST/TypeLoc.h"
@ -60,9 +61,25 @@ static Expr *IgnoreImplicitConstructorSingleStep(Expr *E) {
return 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) { static Expr *IgnoreImplicit(Expr *E) {
return IgnoreExprNodes(E, IgnoreImplicitSingleStep, return IgnoreExprNodes(E, IgnoreImplicitSingleStep,
IgnoreImplicitConstructorSingleStep); IgnoreImplicitConstructorSingleStep,
IgnoreCXXFunctionalCastExprWrappingConstructor);
} }
LLVM_ATTRIBUTE_UNUSED LLVM_ATTRIBUTE_UNUSED

View File

@ -4069,7 +4069,6 @@ struct X {
X(int); X(int);
}; };
X test() { X test() {
// FIXME: Remove `UnknownExpression` due to implicit `CXXFunctionalCastExpr`
[[return X(1);]] [[return X(1);]]
} }
)cpp", )cpp",
@ -4077,12 +4076,11 @@ X test() {
ReturnStatement Statement ReturnStatement Statement
|-'return' IntroducerKeyword |-'return' IntroducerKeyword
|-UnknownExpression ReturnValue |-UnknownExpression ReturnValue
| `-UnknownExpression | |-'X'
| |-'X' | |-'('
| |-'(' | |-IntegerLiteralExpression
| |-IntegerLiteralExpression | | `-'1' LiteralToken
| | `-'1' LiteralToken | `-')'
| `-')'
`-';' `-';'
)txt"})); )txt"}));
} }