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 @@ -4010,6 +4010,14 @@ ToMethod->setLexicalDeclContext(LexicalDC); LexicalDC->addDeclInternal(ToMethod); + + // Implicit params are declared when Sema encounters the definition but this + // never happens when the method is imported. Manually declare the implicit + // params now that the MethodDecl knows its class interface. + if (D->getSelfDecl()) + ToMethod->createImplicitParams(Importer.getToContext(), + ToMethod->getClassInterface()); + return ToMethod; } 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 @@ -5599,6 +5599,30 @@ 2u); } +TEST_P(ASTImporterOptionSpecificTestBase, ImplicitlyDeclareSelf) { + Decl *FromTU = getTuDecl(R"( + __attribute__((objc_root_class)) + @interface Root + @end + @interface C : Root + -(void)method; + @end + @implementation C + -(void)method {} + @end + )", + Lang_OBJCXX, "input.mm"); + auto *FromMethod = LastDeclMatcher().match( + FromTU, namedDecl(hasName("method"))); + ASSERT_TRUE(FromMethod); + auto ToMethod = Import(FromMethod, Lang_OBJCXX); + ASSERT_TRUE(ToMethod); + + // Both methods should have their implicit parameters. + EXPECT_TRUE(FromMethod->getSelfDecl() != nullptr); + EXPECT_TRUE(ToMethod->getSelfDecl() != nullptr); +} + INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterLookupTableTest, DefaultTestValuesForRunOptions, ); diff --git a/clang/unittests/AST/Language.cpp b/clang/unittests/AST/Language.cpp --- a/clang/unittests/AST/Language.cpp +++ b/clang/unittests/AST/Language.cpp @@ -37,8 +37,10 @@ case Lang_CXX2a: BasicArgs = {"-std=c++2a", "-frtti"}; break; - case Lang_OpenCL: case Lang_OBJCXX: + BasicArgs = {"-x", "objective-c++", "-frtti"}; + break; + case Lang_OpenCL: llvm_unreachable("Not implemented yet!"); } return BasicArgs;