@@ -5171,6 +5171,102 @@ TEST_P(ASTImporterOptionSpecificTestBase, ImportOfFriendTemplateWithArgExpr) {
51715171 EXPECT_NE (ToD1->getCanonicalDecl (), ToD2->getCanonicalDecl ());
51725172}
51735173
5174+ struct ASTImporterCImplicitFunctionTest : ASTImporterOptionSpecificTestBase {
5175+ static FunctionDecl *GetImplicitF (FunctionDecl *F) {
5176+ return cast<CallExpr>(cast<CompoundStmt>(F->getBody ())->body_front ())
5177+ ->getDirectCallee ();
5178+ };
5179+ };
5180+
5181+ TEST_P (ASTImporterCImplicitFunctionTest, ImportCImplicitFunction) {
5182+ auto Code = " void f() { implicit_f(); }" ;
5183+
5184+ TranslationUnitDecl *FromTU = getTuDecl (Code, Lang_C, " input.c" );
5185+ auto *FromF = FirstDeclMatcher<FunctionDecl>().match (
5186+ FromTU, functionDecl (hasName (" f" )));
5187+ FunctionDecl *FromImplicitF = GetImplicitF (FromF);
5188+
5189+ ASSERT_TRUE (FromImplicitF->getDeclContext () == cast<DeclContext>(FromTU));
5190+ ASSERT_TRUE (FromImplicitF->getLexicalDeclContext () ==
5191+ cast<DeclContext>(FromF));
5192+ ASSERT_FALSE (FromTU->containsDecl (FromImplicitF));
5193+ ASSERT_TRUE (FromF->containsDecl (FromImplicitF));
5194+
5195+ auto *ToImplicitF = Import (FromImplicitF, Lang_C);
5196+ auto *ToF = Import (FromF, Lang_C);
5197+ ASSERT_TRUE (ToImplicitF);
5198+ TranslationUnitDecl *ToTU = ToImplicitF->getTranslationUnitDecl ();
5199+ EXPECT_FALSE (ToTU->containsDecl (ToImplicitF));
5200+ EXPECT_TRUE (ToF->containsDecl (ToImplicitF));
5201+ }
5202+
5203+ TEST_P (ASTImporterCImplicitFunctionTest, ImportedCImplicitFunctionsLinked) {
5204+ auto Code =
5205+ R"(
5206+ void f1() { implicit_f(); }
5207+ void f2() { implicit_f(); }
5208+ )" ;
5209+
5210+ TranslationUnitDecl *FromTU = getTuDecl (Code, Lang_C, " input.c" );
5211+ auto *FromF1 = FirstDeclMatcher<FunctionDecl>().match (
5212+ FromTU, functionDecl (hasName (" f1" )));
5213+ FunctionDecl *FromImplicitF1 = GetImplicitF (FromF1);
5214+ auto *FromF2 = FirstDeclMatcher<FunctionDecl>().match (
5215+ FromTU, functionDecl (hasName (" f2" )));
5216+ FunctionDecl *FromImplicitF2 = GetImplicitF (FromF2);
5217+
5218+ ASSERT_EQ (FromImplicitF1, FromImplicitF2);
5219+
5220+ auto *ToImplicitF1 = Import (FromImplicitF1, Lang_C);
5221+ auto *ToF1 = Import (FromF1, Lang_C);
5222+ auto *ToF2 = Import (FromF2, Lang_C);
5223+ ASSERT_TRUE (ToImplicitF1);
5224+ EXPECT_EQ (GetImplicitF (ToF1), ToImplicitF1);
5225+ EXPECT_EQ (GetImplicitF (ToF2), ToImplicitF1);
5226+ }
5227+
5228+ TEST_P (ASTImporterCImplicitFunctionTest,
5229+ ImportAndLinkCImplicitFunctionAfterExisting) {
5230+ auto ToCode = " void f1() { implicit_f(); }" ;
5231+ auto FromCode = " void f2() { implicit_f(); }" ;
5232+
5233+ TranslationUnitDecl *ToTU = getToTuDecl (ToCode, Lang_C);
5234+ TranslationUnitDecl *FromTU = getTuDecl (FromCode, Lang_C);
5235+ auto *ToF1 =
5236+ FirstDeclMatcher<FunctionDecl>().match (ToTU, functionDecl (hasName (" f1" )));
5237+ FunctionDecl *ToImplicitF1 = GetImplicitF (ToF1);
5238+ auto *FromF2 = FirstDeclMatcher<FunctionDecl>().match (
5239+ FromTU, functionDecl (hasName (" f2" )));
5240+ FunctionDecl *FromImplicitF2 = GetImplicitF (FromF2);
5241+
5242+ auto *ToImplicitF2 = Import (FromImplicitF2, Lang_C);
5243+ ASSERT_TRUE (ToImplicitF2);
5244+ EXPECT_EQ (ToImplicitF2, ToImplicitF1);
5245+ }
5246+
5247+ TEST_P (ASTImporterCImplicitFunctionTest,
5248+ ImportAndLinkCImplicitFunctionDefinition) {
5249+ auto ToCode = " void f() { implicit_f(); }" ;
5250+ auto FromCode = " int implicit_f() {}" ;
5251+
5252+ TranslationUnitDecl *ToTU = getToTuDecl (ToCode, Lang_C);
5253+ TranslationUnitDecl *FromTU = getTuDecl (FromCode, Lang_C);
5254+ auto *ToF =
5255+ FirstDeclMatcher<FunctionDecl>().match (ToTU, functionDecl (hasName (" f" )));
5256+ FunctionDecl *ToImplicitF = GetImplicitF (ToF);
5257+ auto *FromImplicitFDef = FirstDeclMatcher<FunctionDecl>().match (
5258+ FromTU, functionDecl (hasName (" implicit_f" )));
5259+
5260+ auto *ToImplicitFDef = Import (FromImplicitFDef, Lang_C);
5261+ ASSERT_TRUE (ToImplicitFDef);
5262+ EXPECT_NE (ToImplicitFDef, ToImplicitF);
5263+ EXPECT_EQ (ToImplicitFDef->getPreviousDecl (), ToImplicitF);
5264+ EXPECT_EQ (ToImplicitF->getDefinition (), ToImplicitFDef);
5265+ }
5266+
5267+ INSTANTIATE_TEST_CASE_P (ParameterizedTests, ASTImporterCImplicitFunctionTest,
5268+ DefaultTestValuesForRunOptions, );
5269+
51745270INSTANTIATE_TEST_CASE_P (ParameterizedTests, ASTImporterLookupTableTest,
51755271 DefaultTestValuesForRunOptions, );
51765272
0 commit comments