[PATCH] D65999: [ASTImporter] Import additional flags for functions.
This revision was automatically updated to reflect the committed changes. balazske marked an inline comment as done. Closed by commit rL368655: [ASTImporter] Import additional flags for functions. (authored by balazske, committed by ). Herald added a project: LLVM. Herald added a subscriber: llvm-commits. Changed prior to commit: https://reviews.llvm.org/D65999?vs=214772=214777#toc Repository: rL LLVM CHANGES SINCE LAST ACTION https://reviews.llvm.org/D65999/new/ https://reviews.llvm.org/D65999 Files: cfe/trunk/lib/AST/ASTImporter.cpp cfe/trunk/unittests/AST/ASTImporterTest.cpp Index: cfe/trunk/lib/AST/ASTImporter.cpp === --- cfe/trunk/lib/AST/ASTImporter.cpp +++ cfe/trunk/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. Index: cfe/trunk/unittests/AST/ASTImporterTest.cpp === --- cfe/trunk/unittests/AST/ASTImporterTest.cpp +++ cfe/trunk/unittests/AST/ASTImporterTest.cpp @@ -5314,6 +5314,54 @@ } } +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, LLDBLookupTest, DefaultTestValuesForRunOptions, ); + } // end namespace ast_matchers } // end namespace clang Index: cfe/trunk/lib/AST/ASTImporter.cpp === --- cfe/trunk/lib/AST/ASTImporter.cpp +++ cfe/trunk/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. Index: cfe/trunk/unittests/AST/ASTImporterTest.cpp === --- cfe/trunk/unittests/AST/ASTImporterTest.cpp +++ cfe/trunk/unittests/AST/ASTImporterTest.cpp @@ -5314,6 +5314,54 @@ } } +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( +
[PATCH] D65999: [ASTImporter] Import additional flags for functions.
balazske marked 2 inline comments as done. balazske added inline comments. Comment at: clang/unittests/AST/ASTImporterTest.cpp:5373 +INSTANTIATE_TEST_CASE_P(ParameterizedTests, SVEBuiltins, +::testing::Values(ArgVector{"-target", a_sidorin wrote: > This is a separate functional change and I prefer to move it into a separate > patch. This change came in at a rebase to newest master, I wanted to have this instantiation at the end of the list but this showed up as part of the patch so it was moved now back to the start of the list (of all test instantiations). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D65999/new/ https://reviews.llvm.org/D65999 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D65999: [ASTImporter] Import additional flags for functions.
balazske updated this revision to Diff 214772. balazske added a comment. - Moved SVEBuiltins test instantiation to non-different position. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D65999/new/ https://reviews.llvm.org/D65999 Files: clang/lib/AST/ASTImporter.cpp clang/unittests/AST/ASTImporterTest.cpp Index: clang/unittests/AST/ASTImporterTest.cpp === --- clang/unittests/AST/ASTImporterTest.cpp +++ clang/unittests/AST/ASTImporterTest.cpp @@ -5270,6 +5270,54 @@ } } +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"}), ); @@ -5326,5 +5374,6 @@ INSTANTIATE_TEST_CASE_P(ParameterizedTests, LLDBLookupTest, DefaultTestValuesForRunOptions, ); + } // end namespace ast_matchers } // end namespace clang Index: clang/lib/AST/ASTImporter.cpp === --- clang/lib/AST/ASTImporter.cpp +++ 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. Index: clang/unittests/AST/ASTImporterTest.cpp === --- clang/unittests/AST/ASTImporterTest.cpp +++ clang/unittests/AST/ASTImporterTest.cpp @@ -5270,6 +5270,54 @@ } } +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,
[PATCH] D65999: [ASTImporter] Import additional flags for functions.
a_sidorin accepted this revision. a_sidorin added a comment. This revision is now accepted and ready to land. Hi Balazs, The change looks good. I think it can be committed after an unrelated part is removed. Comment at: clang/unittests/AST/ASTImporterTest.cpp:5373 +INSTANTIATE_TEST_CASE_P(ParameterizedTests, SVEBuiltins, +::testing::Values(ArgVector{"-target", This is a separate functional change and I prefer to move it into a separate patch. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D65999/new/ https://reviews.llvm.org/D65999 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D65999: [ASTImporter] Import additional flags for functions.
balazske marked an inline comment as done. balazske added inline comments. Comment at: clang/unittests/AST/ASTImporterTest.cpp:5239 +TEST_P(ASTImporterOptionSpecificTestBase, ImportOfDefaultImplicitFunctions) { + // Test that import of implicit functions works and the functions balazske wrote: > a_sidorin wrote: > > balazske wrote: > > > martong wrote: > > > > I don't exactly see how this test is related. > > > I do not remember exactly why this test was added but probably the > > > problem is structural equivalence related: The flags are not imported > > > correctly for the first time, and at the second import structural match > > > fails and a new Decl is created instead of returning the existing one. > > > This test fails if the change is not applied. > > Should we consider isExplicitlyDefaulted() when computing structural > > equivalence? > We may use `isExplicitlyDefaulted` and `isDeletedAsWritten` and > `isVirtualAsWritten` but in another patch. It can be good to add check for `isExplicitlyDefaulted` because it is a separate bit and not checked yet. Probably in another patch that has a test for this too. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D65999/new/ https://reviews.llvm.org/D65999 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D65999: [ASTImporter] Import additional flags for functions.
balazske updated this revision to Diff 214585. balazske added a comment. - Using StringRef, added comment. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D65999/new/ https://reviews.llvm.org/D65999 Files: clang/lib/AST/ASTImporter.cpp clang/unittests/AST/ASTImporterTest.cpp Index: clang/unittests/AST/ASTImporterTest.cpp === --- clang/unittests/AST/ASTImporterTest.cpp +++ 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 Index: clang/lib/AST/ASTImporter.cpp === --- clang/lib/AST/ASTImporter.cpp +++ 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. Index: clang/unittests/AST/ASTImporterTest.cpp === --- clang/unittests/AST/ASTImporterTest.cpp +++ 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); + +
[PATCH] D65999: [ASTImporter] Import additional flags for functions.
balazske marked 2 inline comments as done. balazske added inline comments. Comment at: clang/unittests/AST/ASTImporterTest.cpp:5239 +TEST_P(ASTImporterOptionSpecificTestBase, ImportOfDefaultImplicitFunctions) { + // Test that import of implicit functions works and the functions a_sidorin wrote: > balazske wrote: > > martong wrote: > > > I don't exactly see how this test is related. > > I do not remember exactly why this test was added but probably the problem > > is structural equivalence related: The flags are not imported correctly for > > the first time, and at the second import structural match fails and a new > > Decl is created instead of returning the existing one. This test fails if > > the change is not applied. > Should we consider isExplicitlyDefaulted() when computing structural > equivalence? We may use `isExplicitlyDefaulted` and `isDeletedAsWritten` and `isVirtualAsWritten` but in another patch. Comment at: clang/unittests/AST/ASTImporterTest.cpp:5246 +struct X { }; +void f() { X x1, x2; x1 = x2; X *x3 = new X; delete x3; } +)", a_sidorin wrote: > Can we remove the function body or reduce it to 'X x'? The `delete x3` is needed to get a destructor for `X` generated. But the test is about testing the implicit functions and I think it is better to have more of them. This code is there to have these functions generated so I do not like remove of it. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D65999/new/ https://reviews.llvm.org/D65999 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D65999: [ASTImporter] Import additional flags for functions.
a_sidorin added a comment. Hello Balazs, The patch looks good in general. Comment at: clang/unittests/AST/ASTImporterTest.cpp:5239 +TEST_P(ASTImporterOptionSpecificTestBase, ImportOfDefaultImplicitFunctions) { + // Test that import of implicit functions works and the functions balazske wrote: > martong wrote: > > I don't exactly see how this test is related. > I do not remember exactly why this test was added but probably the problem is > structural equivalence related: The flags are not imported correctly for the > first time, and at the second import structural match fails and a new Decl is > created instead of returning the existing one. This test fails if the change > is not applied. Should we consider isExplicitlyDefaulted() when computing structural equivalence? Comment at: clang/unittests/AST/ASTImporterTest.cpp:5242 + // are merged into one chain. + auto GetDeclToImport = [this](const char *File) { +Decl *FromTU = getTuDecl( `const char *` -> `StringRef`? Comment at: clang/unittests/AST/ASTImporterTest.cpp:5246 +struct X { }; +void f() { X x1, x2; x1 = x2; X *x3 = new X; delete x3; } +)", Can we remove the function body or reduce it to 'X x'? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D65999/new/ https://reviews.llvm.org/D65999 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D65999: [ASTImporter] Import additional flags for functions.
balazske marked an inline comment as done. balazske added inline comments. Comment at: clang/unittests/AST/ASTImporterTest.cpp:5239 +TEST_P(ASTImporterOptionSpecificTestBase, ImportOfDefaultImplicitFunctions) { + // Test that import of implicit functions works and the functions martong wrote: > I don't exactly see how this test is related. I do not remember exactly why this test was added but probably the problem is structural equivalence related: The flags are not imported correctly for the first time, and at the second import structural match fails and a new Decl is created instead of returning the existing one. This test fails if the change is not applied. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D65999/new/ https://reviews.llvm.org/D65999 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D65999: [ASTImporter] Import additional flags for functions.
martong added a comment. LGTM, but I don't exactly see how the first test is related. Could you please explain? Comment at: clang/unittests/AST/ASTImporterTest.cpp:5239 +TEST_P(ASTImporterOptionSpecificTestBase, ImportOfDefaultImplicitFunctions) { + // Test that import of implicit functions works and the functions I don't exactly see how this test is related. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D65999/new/ https://reviews.llvm.org/D65999 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D65999: [ASTImporter] Import additional flags for functions.
balazske created this revision. Herald added subscribers: cfe-commits, gamesh411, Szelethus, dkrupp. Herald added a reviewer: martong. Herald added a reviewer: a.sidorin. Herald added a reviewer: shafik. Herald added a project: clang. At AST import of function delcarations import the flags for defaulted and deleted. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D65999 Files: clang/lib/AST/ASTImporter.cpp clang/unittests/AST/ASTImporterTest.cpp Index: clang/unittests/AST/ASTImporterTest.cpp === --- clang/unittests/AST/ASTImporterTest.cpp +++ clang/unittests/AST/ASTImporterTest.cpp @@ -5236,6 +5236,53 @@ EXPECT_EQ(ImportedX->getCanonicalDecl(), ToX->getCanonicalDecl()); } +TEST_P(ASTImporterOptionSpecificTestBase, ImportOfDefaultImplicitFunctions) { + // Test that import of implicit functions works and the functions + // are merged into one chain. + auto GetDeclToImport = [this](const char *File) { +Decl *FromTU = getTuDecl( +R"( +struct 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, ); Index: clang/lib/AST/ASTImporter.cpp === --- clang/lib/AST/ASTImporter.cpp +++ clang/lib/AST/ASTImporter.cpp @@ -3288,6 +3288,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. Index: clang/unittests/AST/ASTImporterTest.cpp === --- clang/unittests/AST/ASTImporterTest.cpp +++ clang/unittests/AST/ASTImporterTest.cpp @@ -5236,6 +5236,53 @@ EXPECT_EQ(ImportedX->getCanonicalDecl(), ToX->getCanonicalDecl()); } +TEST_P(ASTImporterOptionSpecificTestBase, ImportOfDefaultImplicitFunctions) { + // Test that import of implicit functions works and the functions + // are merged into one chain. + auto GetDeclToImport = [this](const char *File) { +Decl *FromTU = getTuDecl( +R"( +struct 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(; + +