[cfe-dev] Detect if a CXXConstructExpr is implicit
Loïc Joly via cfe-dev
cfe-dev at lists.llvm.org
Tue Feb 12 08:44:09 PST 2019
In the following code:
https://godbolt.org/z/czpHOf
classA{
public:
A();
A(A const&a);
A(inti);
};
voidf(A a);
voidg() {
A a;
f(a); // 1
f(2); // 2
}
The generated AST contains nodes about object construction that are
implicit (the copy constructor for 1, the conversion then the copy
constructor for 2).
|-CallExpr <line:12:5, col:8> 'void'
| |-ImplicitCastExpr <col:5> 'void (*)(A)' <FunctionToPointerDecay>
| | `-DeclRefExpr <col:5> 'void (A)' lvalue Function 0x55c42589b208
'f' 'void (A)'
| `-CXXConstructExpr <col:7> 'A' 'void (const A &)'
| `-ImplicitCastExpr <col:7> 'const A' lvalue <NoOp>
| `-DeclRefExpr <col:7> 'A' lvalue Var 0x55c42589b3c8 'a' 'A'
`-ExprWithCleanups <line:13:5, col:8> 'void'
`-CallExpr <col:5, col:8> 'void'
|-ImplicitCastExpr <col:5> 'void (*)(A)' <FunctionToPointerDecay>
| `-DeclRefExpr <col:5> 'void (A)' lvalue Function
0x55c42589b208 'f' 'void (A)'
`-CXXConstructExpr <col:7> 'A' 'void (const A &)' elidable
`-MaterializeTemporaryExpr <col:7> 'const A' lvalue
`-ImplicitCastExpr <col:7> 'const A' <NoOp>
`-ImplicitCastExpr <col:7> 'A' <ConstructorConversion>
`-CXXConstructExpr <col:7> 'A' 'void (int)'
`-IntegerLiteral <col:7> 'int' 2
Do you know if there is a way to detect that these constructions are
implicit (as opposed to constructions written as the type name followed
by initialization?)
Thank you!
---
Loïc Joly
More information about the cfe-dev
mailing list