diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -3292,6 +3292,9 @@ 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/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -5270,9 +5270,53 @@ } } -INSTANTIATE_TEST_CASE_P(ParameterizedTests, SVEBuiltins, - ::testing::Values(ArgVector{"-target", - "aarch64-linux-gnu"}), ); +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, ASTImporterLookupTableTest, DefaultTestValuesForRunOptions, ); @@ -5326,5 +5370,9 @@ INSTANTIATE_TEST_CASE_P(ParameterizedTests, LLDBLookupTest, DefaultTestValuesForRunOptions, ); +INSTANTIATE_TEST_CASE_P(ParameterizedTests, SVEBuiltins, + ::testing::Values(ArgVector{"-target", + "aarch64-linux-gnu"}), ); + } // end namespace ast_matchers } // end namespace clang