Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -2239,6 +2239,17 @@ 2, std::numeric_limits::max()> allOf = {internal::DynTypedMatcher::VO_AllOf}; +/// \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; + /// \brief Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) /// /// Given Index: lib/AST/ASTImporter.cpp =================================================================== --- lib/AST/ASTImporter.cpp +++ lib/AST/ASTImporter.cpp @@ -280,6 +280,7 @@ Expr *VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E); Expr *VisitCXXNamedCastExpr(CXXNamedCastExpr *E); Expr *VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E); + Expr *VisitTypeTraitExpr(TypeTraitExpr *E); template @@ -5529,6 +5530,27 @@ Replacement); } +Expr *ASTNodeImporter::VisitTypeTraitExpr(TypeTraitExpr *E) { + QualType ToType = Importer.Import(E->getType()); + if (ToType.isNull()) + return nullptr; + + SmallVector ToArgVec; + for(auto FromArg : E->getArgs()) { + TypeSourceInfo *ToTI = Importer.Import(FromArg); + ToArgVec.push_back(ToTI); + } + ArrayRef ToArgRef(ToArgVec); + + return TypeTraitExpr::Create( Importer.getToContext(), + ToType, + Importer.Import(E->getLocStart()), + E->getTrait(), + ToArgRef, + Importer.Import(E->getLocEnd()), + E->getValue()); +} + void ASTNodeImporter::ImportOverrides(CXXMethodDecl *ToMethod, CXXMethodDecl *FromMethod) { for (auto *FromOverriddenMethod : FromMethod->overridden_methods()) Index: unittests/AST/ASTImporterTest.cpp =================================================================== --- unittests/AST/ASTImporterTest.cpp +++ unittests/AST/ASTImporterTest.cpp @@ -485,6 +485,16 @@ has(atomicType())))))))))); } +TEST(ImportExpr, ImportTypeTraitExpr) { + MatchVerifier Verifier; + EXPECT_TRUE(testImport("void declToImport() { __builtin_types_compatible_p(int, int); }", + Lang_C, "", Lang_C, Verifier, + functionDecl( + hasBody( + compoundStmt( + has( + typeTraitExpr())))))); +} } // end namespace ast_matchers } // end namespace clang