[PATCH] D110123: [Proof of concept] Serialize fewer transitive methods in `METHOD_POOL`.

Volodymyr Sapsai via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 21 12:59:47 PDT 2021


vsapsai updated this revision to Diff 374016.
vsapsai added a comment.

Add a [failing] test case that checks handling methods from transitive modules.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D110123

Files:
  clang/lib/Serialization/ASTWriter.cpp
  clang/test/Modules/method_pool_transitive.m


Index: clang/test/Modules/method_pool_transitive.m
===================================================================
--- /dev/null
+++ clang/test/Modules/method_pool_transitive.m
@@ -0,0 +1,46 @@
+// RUN: rm -rf %t
+// RUN: split-file %s %t
+// RUN: %clang_cc1 -Wobjc-multiple-method-names -fsyntax-only -fmodules-cache-path=%t/modules.cache -fmodules -fimplicit-module-maps -F %t/Frameworks %t/test.m -verify
+
+// Verify we are handling methods from transitive modules, not just from immediate ones.
+
+//--- Frameworks/Indirect.framework/Headers/Indirect.h
+ at interface NSObject
+ at end
+
+ at interface Indirect : NSObject
+- (int)method;
+ at end
+
+//--- Frameworks/Indirect.framework/Modules/module.modulemap
+framework module Indirect {
+  header "Indirect.h"
+  export *
+}
+
+//--- Frameworks/Immediate.framework/Headers/Immediate.h
+#import <Indirect/Indirect.h>
+ at interface Immediate : NSObject
+- (void)method;
+ at end
+
+//--- Frameworks/Immediate.framework/Modules/module.modulemap
+framework module Immediate {
+  header "Immediate.h"
+  export *
+}
+
+//--- test.m
+#import <Immediate/Immediate.h>
+
+int foo(id obj) {
+  return [obj method];  // expected-warning{{multiple methods named 'method' found}}
+  // expected-note at Frameworks/Indirect.framework/Headers/Indirect.h:5{{using}}
+  // expected-note at Frameworks/Immediate.framework/Headers/Immediate.h:3{{also found}}
+}
+
+void bar(id obj) {
+  [obj method];  // expected-warning{{multiple methods named 'method' found}}
+  // expected-note at Frameworks/Indirect.framework/Headers/Indirect.h:5{{using}}
+  // expected-note at Frameworks/Immediate.framework/Headers/Immediate.h:3{{also found}}
+}
Index: clang/lib/Serialization/ASTWriter.cpp
===================================================================
--- clang/lib/Serialization/ASTWriter.cpp
+++ clang/lib/Serialization/ASTWriter.cpp
@@ -3130,15 +3130,21 @@
       if (Chain && ID < FirstSelectorID) {
         // Selector already exists. Did it change?
         bool changed = false;
-        for (ObjCMethodList *M = &Data.Instance;
-             !changed && M && M->getMethod(); M = M->getNext()) {
-          if (!M->getMethod()->isFromASTFile())
+        for (ObjCMethodList *M = &Data.Instance; M && M->getMethod();
+             M = M->getNext()) {
+          if (!M->getMethod()->isFromASTFile()) {
             changed = true;
+            Data.Instance = *M;
+            break;
+          }
         }
-        for (ObjCMethodList *M = &Data.Factory; !changed && M && M->getMethod();
+        for (ObjCMethodList *M = &Data.Factory; M && M->getMethod();
              M = M->getNext()) {
-          if (!M->getMethod()->isFromASTFile())
+          if (!M->getMethod()->isFromASTFile()) {
             changed = true;
+            Data.Factory = *M;
+            break;
+          }
         }
         if (!changed)
           continue;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D110123.374016.patch
Type: text/x-patch
Size: 2865 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210921/2a39bf2d/attachment.bin>


More information about the cfe-commits mailing list