szepet created this revision. Adding VisitCXXPseudoDestructorExpr callback to the ASTImporter.
Note: This is based on: https://github.com/haoNoQ/clang/blob/summary-ipa-draft/lib/AST/ASTImporter.cpp#L7624 . https://reviews.llvm.org/D38843 Files: lib/AST/ASTImporter.cpp unittests/AST/ASTImporterTest.cpp Index: unittests/AST/ASTImporterTest.cpp =================================================================== --- unittests/AST/ASTImporterTest.cpp +++ unittests/AST/ASTImporterTest.cpp @@ -535,5 +535,21 @@ binaryOperator(has(cxxUnresolvedConstructExpr())))))))))); } +const internal::VariadicDynCastAllOfMatcher<Expr, CXXPseudoDestructorExpr> + cxxPseudoDestructorExpr; + +TEST(ImportExpr, ImportCXXPseudoDestructorExpr) { + MatchVerifier<Decl> Verifier; + EXPECT_TRUE( + testImport("typedef int T;" + "void declToImport(int *p) {" + "p->T::~T();" + "}", + Lang_CXX, "", Lang_CXX, Verifier, + functionDecl(has(compoundStmt(has( + callExpr(has(cxxPseudoDestructorExpr())))))))); +} + + } // end namespace ast_matchers } // end namespace clang Index: lib/AST/ASTImporter.cpp =================================================================== --- lib/AST/ASTImporter.cpp +++ lib/AST/ASTImporter.cpp @@ -278,6 +278,7 @@ Expr *VisitExprWithCleanups(ExprWithCleanups *EWC); Expr *VisitCXXThisExpr(CXXThisExpr *E); Expr *VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E); + Expr *VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E); Expr *VisitMemberExpr(MemberExpr *E); Expr *VisitCallExpr(CallExpr *E); Expr *VisitInitListExpr(InitListExpr *E); @@ -5540,6 +5541,38 @@ E->isOverloaded(), ToDecls.begin(), ToDecls.end()); } + +Expr *ASTNodeImporter::VisitCXXPseudoDestructorExpr( + CXXPseudoDestructorExpr *E) { + + Expr *BaseE = Importer.Import(E->getBase()); + if (!BaseE) + return nullptr; + + TypeSourceInfo *ScopeInfo = Importer.Import(E->getScopeTypeInfo()); + + PseudoDestructorTypeStorage Storage; + if (IdentifierInfo *FromII = E->getDestroyedTypeIdentifier()) { + IdentifierInfo *ToII = Importer.Import(FromII); + if (!ToII) + return nullptr; + Storage = PseudoDestructorTypeStorage( + ToII, Importer.Import(E->getDestroyedTypeLoc())); + } else { + TypeSourceInfo *TI = Importer.Import(E->getDestroyedTypeInfo()); + if (!TI) + return nullptr; + Storage = PseudoDestructorTypeStorage(TI); + } + + return new (Importer.getToContext()) CXXPseudoDestructorExpr( + Importer.getToContext(), BaseE, E->isArrow(), + Importer.Import(E->getOperatorLoc()), + Importer.Import(E->getQualifierLoc()), + ScopeInfo, Importer.Import(E->getColonColonLoc()), + Importer.Import(E->getTildeLoc()), Storage); +} + Expr *ASTNodeImporter::VisitCallExpr(CallExpr *E) { QualType T = Importer.Import(E->getType()); if (T.isNull())
Index: unittests/AST/ASTImporterTest.cpp =================================================================== --- unittests/AST/ASTImporterTest.cpp +++ unittests/AST/ASTImporterTest.cpp @@ -535,5 +535,21 @@ binaryOperator(has(cxxUnresolvedConstructExpr())))))))))); } +const internal::VariadicDynCastAllOfMatcher<Expr, CXXPseudoDestructorExpr> + cxxPseudoDestructorExpr; + +TEST(ImportExpr, ImportCXXPseudoDestructorExpr) { + MatchVerifier<Decl> Verifier; + EXPECT_TRUE( + testImport("typedef int T;" + "void declToImport(int *p) {" + "p->T::~T();" + "}", + Lang_CXX, "", Lang_CXX, Verifier, + functionDecl(has(compoundStmt(has( + callExpr(has(cxxPseudoDestructorExpr())))))))); +} + + } // end namespace ast_matchers } // end namespace clang Index: lib/AST/ASTImporter.cpp =================================================================== --- lib/AST/ASTImporter.cpp +++ lib/AST/ASTImporter.cpp @@ -278,6 +278,7 @@ Expr *VisitExprWithCleanups(ExprWithCleanups *EWC); Expr *VisitCXXThisExpr(CXXThisExpr *E); Expr *VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E); + Expr *VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E); Expr *VisitMemberExpr(MemberExpr *E); Expr *VisitCallExpr(CallExpr *E); Expr *VisitInitListExpr(InitListExpr *E); @@ -5540,6 +5541,38 @@ E->isOverloaded(), ToDecls.begin(), ToDecls.end()); } + +Expr *ASTNodeImporter::VisitCXXPseudoDestructorExpr( + CXXPseudoDestructorExpr *E) { + + Expr *BaseE = Importer.Import(E->getBase()); + if (!BaseE) + return nullptr; + + TypeSourceInfo *ScopeInfo = Importer.Import(E->getScopeTypeInfo()); + + PseudoDestructorTypeStorage Storage; + if (IdentifierInfo *FromII = E->getDestroyedTypeIdentifier()) { + IdentifierInfo *ToII = Importer.Import(FromII); + if (!ToII) + return nullptr; + Storage = PseudoDestructorTypeStorage( + ToII, Importer.Import(E->getDestroyedTypeLoc())); + } else { + TypeSourceInfo *TI = Importer.Import(E->getDestroyedTypeInfo()); + if (!TI) + return nullptr; + Storage = PseudoDestructorTypeStorage(TI); + } + + return new (Importer.getToContext()) CXXPseudoDestructorExpr( + Importer.getToContext(), BaseE, E->isArrow(), + Importer.Import(E->getOperatorLoc()), + Importer.Import(E->getQualifierLoc()), + ScopeInfo, Importer.Import(E->getColonColonLoc()), + Importer.Import(E->getTildeLoc()), Storage); +} + Expr *ASTNodeImporter::VisitCallExpr(CallExpr *E) { QualType T = Importer.Import(E->getType()); if (T.isNull())
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits