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;
}
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<ObjCMethodDecl>().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, );
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;