[PATCH] D71112: [ASTImporter] Implicitly declare parameters for imported ObjCMethodDecls

Raphael Isemann via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Dec 6 06:11:18 PST 2019


teemperor updated this revision to Diff 232541.
teemperor added a comment.

- Put code in raw string (Thanks Gabor!)


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D71112/new/

https://reviews.llvm.org/D71112

Files:
  clang/lib/AST/ASTImporter.cpp
  clang/unittests/AST/ASTImporterTest.cpp
  clang/unittests/AST/Language.cpp


Index: clang/unittests/AST/Language.cpp
===================================================================
--- clang/unittests/AST/Language.cpp
+++ clang/unittests/AST/Language.cpp
@@ -37,9 +37,11 @@
   case Lang_CXX2a:
     BasicArgs = {"-std=c++2a", "-frtti"};
     break;
-  case Lang_OpenCL:
   case Lang_OBJCXX:
-    llvm_unreachable("Not implemented yet!");
+    BasicArgs = {"-x", "objective-c++", "-frtti"};
+    break;
+  case Lang_OpenCL:
+    llvm_unreachable("-std=objc++");
   }
   return BasicArgs;
 }
Index: clang/unittests/AST/ASTImporterTest.cpp
===================================================================
--- clang/unittests/AST/ASTImporterTest.cpp
+++ 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<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, );
 
Index: clang/lib/AST/ASTImporter.cpp
===================================================================
--- clang/lib/AST/ASTImporter.cpp
+++ 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;
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D71112.232541.patch
Type: text/x-patch
Size: 2555 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20191206/37bd2133/attachment-0001.bin>


More information about the cfe-commits mailing list