diff options
author | Aleksei Sidorin <a.sidorin@samsung.com> | 2017-11-27 10:30:00 +0000 |
---|---|---|
committer | Aleksei Sidorin <a.sidorin@samsung.com> | 2017-11-27 10:30:00 +0000 |
commit | 60ccb7daf14df2da16511cd443028038d0843143 (patch) | |
tree | e2048447d006d8581467b8114f10336e05ae1608 /clang | |
parent | bd2c7eb923116a15f571bd39daf38da98d259db2 (diff) | |
download | bcm5719-llvm-60ccb7daf14df2da16511cd443028038d0843143.tar.gz bcm5719-llvm-60ccb7daf14df2da16511cd443028038d0843143.zip |
[ASTImporter] Support importing CXXPseudoDestructorExpr
Patch by Peter Szecsi!
Differential Revision: https://reviews.llvm.org/D38843
llvm-svn: 319015
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/AST/ASTImporter.cpp | 34 | ||||
-rw-r--r-- | clang/unittests/AST/ASTImporterTest.cpp | 16 |
2 files changed, 50 insertions, 0 deletions
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index 8bfc9030a60..0e627f9737c 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -283,6 +283,7 @@ namespace clang { 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); @@ -5725,6 +5726,39 @@ Expr *ASTNodeImporter::VisitMemberExpr(MemberExpr *E) { E->getObjectKind()); } +Expr *ASTNodeImporter::VisitCXXPseudoDestructorExpr( + CXXPseudoDestructorExpr *E) { + + Expr *BaseE = Importer.Import(E->getBase()); + if (!BaseE) + return nullptr; + + TypeSourceInfo *ScopeInfo = Importer.Import(E->getScopeTypeInfo()); + if (!ScopeInfo && E->getScopeTypeInfo()) + return nullptr; + + 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()) diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp index 2a8f70c2143..86518e132d4 100644 --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -567,5 +567,21 @@ TEST(ImportExpr, ImportTypeTraitExprValDep) { ))))))))))); } +const internal::VariadicDynCastAllOfMatcher<Expr, CXXPseudoDestructorExpr> + cxxPseudoDestructorExpr; + +TEST(ImportExpr, ImportCXXPseudoDestructorExpr) { + MatchVerifier<Decl> Verifier; + EXPECT_TRUE( + testImport("typedef int T;" + "void declToImport(int *p) {" + " T t;" + " p->T::~T();" + "}", + Lang_CXX, "", Lang_CXX, Verifier, + functionDecl(has(compoundStmt(has( + callExpr(has(cxxPseudoDestructorExpr())))))))); +} + } // end namespace ast_matchers } // end namespace clang |