[ASTImporter] Support TypeTraitExpr

Patch by Takafumi Kubota!

Differential Revision: https://reviews.llvm.org/D39722

llvm-svn: 318998
This commit is contained in:
Aleksei Sidorin 2017-11-26 17:04:06 +00:00
parent 7410eead0c
commit b05f37afcb
2 changed files with 62 additions and 0 deletions

View File

@ -291,6 +291,7 @@ namespace clang {
Expr *VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E);
Expr *VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
Expr *VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E);
Expr *VisitTypeTraitExpr(TypeTraitExpr *E);
template<typename IIter, typename OIter>
@ -5890,6 +5891,26 @@ Expr *ASTNodeImporter::VisitSubstNonTypeTemplateParmExpr(
Replacement);
}
Expr *ASTNodeImporter::VisitTypeTraitExpr(TypeTraitExpr *E) {
QualType ToType = Importer.Import(E->getType());
if (ToType.isNull())
return nullptr;
SmallVector<TypeSourceInfo *, 4> ToArgs(E->getNumArgs());
if (ImportContainerChecked(E->getArgs(), ToArgs))
return nullptr;
// According to Sema::BuildTypeTrait(), if E is value-dependent,
// Value is always false.
bool ToValue = false;
if (!E->isValueDependent())
ToValue = E->getValue();
return TypeTraitExpr::Create(
Importer.getToContext(), ToType, Importer.Import(E->getLocStart()),
E->getTrait(), ToArgs, Importer.Import(E->getLocEnd()), ToValue);
}
void ASTNodeImporter::ImportOverrides(CXXMethodDecl *ToMethod,
CXXMethodDecl *FromMethod) {
for (auto *FromOverriddenMethod : FromMethod->overridden_methods())

View File

@ -525,6 +525,47 @@ TEST(ImportType, ImportPackExpansion) {
declRefExpr()))))))))));
}
/// \brief Matches __builtin_types_compatible_p:
/// GNU extension to check equivalent types
/// Given
/// \code
/// __builtin_types_compatible_p(int, int)
/// \endcode
// will generate TypeTraitExpr <...> 'int'
const internal::VariadicDynCastAllOfMatcher<Stmt, TypeTraitExpr> typeTraitExpr;
TEST(ImportExpr, ImportTypeTraitExpr) {
MatchVerifier<Decl> Verifier;
EXPECT_TRUE(testImport("void declToImport() { "
" __builtin_types_compatible_p(int, int);"
"}",
Lang_C, "", Lang_C, Verifier,
functionDecl(
hasBody(
compoundStmt(
has(
typeTraitExpr(hasType(asString("int")))))))));
}
TEST(ImportExpr, ImportTypeTraitExprValDep) {
MatchVerifier<Decl> Verifier;
EXPECT_TRUE(testImport("template<typename T> struct declToImport {"
" void m() { __is_pod(T); }"
"};"
"void f() { declToImport<int>().m(); }",
Lang_CXX11, "", Lang_CXX11, Verifier,
classTemplateDecl(
has(
cxxRecordDecl(
has(
functionDecl(
hasBody(
compoundStmt(
has(
typeTraitExpr(
hasType(booleanType())
)))))))))));
}
} // end namespace ast_matchers
} // end namespace clang