tk1012 updated this revision to Diff 123539. tk1012 added a comment. Herald added a subscriber: rnkovacs.
Hello, Aleksei. I'm sorry for the long response time. I update the diff to follow your comments. Updates 1. I apply clang-format -style=llvm to ASTMatchers.h and ASTImporter.cpp. I don't apply it to ASTImporterTest.cpp for readability of the matching types. 2. I add `return nullptr;` if `ToTI` is `nullptr`. 3. I directly pass `ToArgVec` to `TypeTraitExpr::Create()` 4. I add a check for the value-dependent of `E'. https://reviews.llvm.org/D39722 Files: include/clang/ASTMatchers/ASTMatchers.h lib/AST/ASTImporter.cpp unittests/AST/ASTImporterTest.cpp Index: unittests/AST/ASTImporterTest.cpp =================================================================== --- unittests/AST/ASTImporterTest.cpp +++ unittests/AST/ASTImporterTest.cpp @@ -525,6 +525,16 @@ declRefExpr())))))))))); } +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())))))); +} } // end namespace ast_matchers } // end namespace clang Index: lib/AST/ASTImporter.cpp =================================================================== --- lib/AST/ASTImporter.cpp +++ lib/AST/ASTImporter.cpp @@ -283,6 +283,7 @@ Expr *VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E); Expr *VisitCXXNamedCastExpr(CXXNamedCastExpr *E); Expr *VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E); + Expr *VisitTypeTraitExpr(TypeTraitExpr *E); template<typename IIter, typename OIter> @@ -5612,6 +5613,28 @@ Replacement); } +Expr *ASTNodeImporter::VisitTypeTraitExpr(TypeTraitExpr *E) { + QualType ToType = Importer.Import(E->getType()); + if (ToType.isNull()) + return nullptr; + + SmallVector<TypeSourceInfo *, 4> ToArgVec; + for (auto FromArg : E->getArgs()) { + TypeSourceInfo *ToTI = Importer.Import(FromArg); + if (!ToTI) + return nullptr; + ToArgVec.push_back(ToTI); + } + + // According to Sema::BuildTypeTrait(), if E is value-dependent, + // Value is always false. + bool ToValue = (!E->isValueDependent()) ? E->getValue() : false; + + return TypeTraitExpr::Create( + Importer.getToContext(), ToType, Importer.Import(E->getLocStart()), + E->getTrait(), ToArgVec, Importer.Import(E->getLocEnd()), ToValue); +} + void ASTNodeImporter::ImportOverrides(CXXMethodDecl *ToMethod, CXXMethodDecl *FromMethod) { for (auto *FromOverriddenMethod : FromMethod->overridden_methods()) Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -2241,6 +2241,15 @@ 2, std::numeric_limits<unsigned>::max()> 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: unittests/AST/ASTImporterTest.cpp =================================================================== --- unittests/AST/ASTImporterTest.cpp +++ unittests/AST/ASTImporterTest.cpp @@ -525,6 +525,16 @@ declRefExpr())))))))))); } +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())))))); +} } // end namespace ast_matchers } // end namespace clang Index: lib/AST/ASTImporter.cpp =================================================================== --- lib/AST/ASTImporter.cpp +++ lib/AST/ASTImporter.cpp @@ -283,6 +283,7 @@ Expr *VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E); Expr *VisitCXXNamedCastExpr(CXXNamedCastExpr *E); Expr *VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E); + Expr *VisitTypeTraitExpr(TypeTraitExpr *E); template<typename IIter, typename OIter> @@ -5612,6 +5613,28 @@ Replacement); } +Expr *ASTNodeImporter::VisitTypeTraitExpr(TypeTraitExpr *E) { + QualType ToType = Importer.Import(E->getType()); + if (ToType.isNull()) + return nullptr; + + SmallVector<TypeSourceInfo *, 4> ToArgVec; + for (auto FromArg : E->getArgs()) { + TypeSourceInfo *ToTI = Importer.Import(FromArg); + if (!ToTI) + return nullptr; + ToArgVec.push_back(ToTI); + } + + // According to Sema::BuildTypeTrait(), if E is value-dependent, + // Value is always false. + bool ToValue = (!E->isValueDependent()) ? E->getValue() : false; + + return TypeTraitExpr::Create( + Importer.getToContext(), ToType, Importer.Import(E->getLocStart()), + E->getTrait(), ToArgVec, Importer.Import(E->getLocEnd()), ToValue); +} + void ASTNodeImporter::ImportOverrides(CXXMethodDecl *ToMethod, CXXMethodDecl *FromMethod) { for (auto *FromOverriddenMethod : FromMethod->overridden_methods()) Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -2241,6 +2241,15 @@ 2, std::numeric_limits<unsigned>::max()> 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
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits