From: Balazs Keri <1.int32@gmail.com> Date: Tue, 13 Aug 2019 08:04:06 +0000 (+0000) Subject: [ASTImporter] Import additional flags for functions. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dd1f0cfb631e1c4f8c5a0caac3080bac9385a3c1;p=clang [ASTImporter] Import additional flags for functions. Summary: At AST import of function delcarations import the flags for defaulted and deleted. Reviewers: martong, a.sidorin, shafik, a_sidorin Reviewed By: a_sidorin Subscribers: rnkovacs, dkrupp, Szelethus, gamesh411, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D65999 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@368655 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTImporter.cpp b/lib/AST/ASTImporter.cpp index e999e89eda..651c675649 100644 --- a/lib/AST/ASTImporter.cpp +++ b/lib/AST/ASTImporter.cpp @@ -3292,6 +3292,9 @@ ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) { ToFunction->setVirtualAsWritten(D->isVirtualAsWritten()); ToFunction->setTrivial(D->isTrivial()); ToFunction->setPure(D->isPure()); + ToFunction->setDefaulted(D->isDefaulted()); + ToFunction->setExplicitlyDefaulted(D->isExplicitlyDefaulted()); + ToFunction->setDeletedAsWritten(D->isDeletedAsWritten()); ToFunction->setRangeEnd(ToEndLoc); // Set the parameters. diff --git a/unittests/AST/ASTImporterTest.cpp b/unittests/AST/ASTImporterTest.cpp index 3cdad0dfd5..78b67d836b 100644 --- a/unittests/AST/ASTImporterTest.cpp +++ b/unittests/AST/ASTImporterTest.cpp @@ -5314,6 +5314,54 @@ TEST_P(SVEBuiltins, ImportTypes) { } } +TEST_P(ASTImporterOptionSpecificTestBase, ImportOfDefaultImplicitFunctions) { + // Test that import of implicit functions works and the functions + // are merged into one chain. + auto GetDeclToImport = [this](StringRef File) { + Decl *FromTU = getTuDecl( + R"( + struct X { }; + // Force generating some implicit operator definitions for X. + void f() { X x1, x2; x1 = x2; X *x3 = new X; delete x3; } + )", + Lang_CXX11, File); + auto *FromD = FirstDeclMatcher().match( + FromTU, cxxRecordDecl(hasName("X"), unless(isImplicit()))); + // Destructor is picked as one example of implicit function. + return FromD->getDestructor(); + }; + + auto *ToD1 = Import(GetDeclToImport("input1.cc"), Lang_CXX11); + ASSERT_TRUE(ToD1); + + auto *ToD2 = Import(GetDeclToImport("input2.cc"), Lang_CXX11); + ASSERT_TRUE(ToD2); + + EXPECT_EQ(ToD1->getCanonicalDecl(), ToD2->getCanonicalDecl()); +} + +TEST_P(ASTImporterOptionSpecificTestBase, + ImportOfExplicitlyDefaultedOrDeleted) { + Decl *FromTU = getTuDecl( + R"( + struct X { X() = default; X(const X&) = delete; }; + )", + Lang_CXX11); + auto *FromX = FirstDeclMatcher().match( + FromTU, cxxRecordDecl(hasName("X"))); + auto *ImportedX = Import(FromX, Lang_CXX11); + auto *Constr1 = FirstDeclMatcher().match( + ImportedX, cxxConstructorDecl(hasName("X"), unless(isImplicit()))); + auto *Constr2 = LastDeclMatcher().match( + ImportedX, cxxConstructorDecl(hasName("X"), unless(isImplicit()))); + + ASSERT_TRUE(ImportedX); + EXPECT_TRUE(Constr1->isDefaulted()); + EXPECT_TRUE(Constr1->isExplicitlyDefaulted()); + EXPECT_TRUE(Constr2->isDeletedAsWritten()); + EXPECT_EQ(ImportedX->isAggregate(), FromX->isAggregate()); +} + INSTANTIATE_TEST_CASE_P(ParameterizedTests, SVEBuiltins, ::testing::Values(ArgVector{"-target", "aarch64-linux-gnu"}), ); @@ -5370,5 +5418,6 @@ INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportVariables, INSTANTIATE_TEST_CASE_P(ParameterizedTests, LLDBLookupTest, DefaultTestValuesForRunOptions, ); + } // end namespace ast_matchers } // end namespace clang