[PATCH] D110453: [modules] Update visibility for merged ObjCInterfaceDecl definitions.

Volodymyr Sapsai via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Sep 24 16:03:07 PDT 2021


vsapsai created this revision.
vsapsai added reviewers: bruno, bnbarham.
Herald added a subscriber: ributzka.
vsapsai requested review of this revision.
Herald added a project: clang.

We keep using the first encountered definition and need to take into
account visibility from subsequent definitions. For example, if the
first definition is hidden and the second is visible, we need to make
the first one visible too.

rdar://82263843


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D110453

Files:
  clang/lib/Serialization/ASTReaderDecl.cpp
  clang/test/Modules/merge-objc-interface-visibility.m


Index: clang/test/Modules/merge-objc-interface-visibility.m
===================================================================
--- /dev/null
+++ clang/test/Modules/merge-objc-interface-visibility.m
@@ -0,0 +1,61 @@
+// RUN: rm -rf %t
+// RUN: split-file %s %t
+// RUN: %clang_cc1 -emit-llvm -o %t/test.bc -F%t/Frameworks %t/test.m -DHIDDEN_FIRST=1 \
+// RUN:            -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/modules.cache
+// RUN: %clang_cc1 -emit-llvm -o %t/test.bc -F%t/Frameworks %t/test.m -DHIDDEN_FIRST=0 \
+// RUN:            -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/modules.cache
+
+// Test a case when Objective-C interface is imported both as hidden and as visible.
+
+//--- Frameworks/Foundation.framework/Headers/Foundation.h
+ at interface NSObject
+ at end
+
+//--- Frameworks/Foundation.framework/Modules/module.modulemap
+framework module Foundation {
+  header "Foundation.h"
+  export *
+}
+
+//--- Frameworks/Regular.framework/Headers/Regular.h
+#import <Foundation/Foundation.h>
+ at interface Regular : NSObject
+ at end
+
+//--- Frameworks/Regular.framework/Modules/module.modulemap
+framework module Regular {
+  header "Regular.h"
+  export *
+}
+
+//--- Frameworks/RegularHider.framework/Headers/Visible.h
+// Empty, file required to create a module.
+
+//--- Frameworks/RegularHider.framework/Headers/Hidden.h
+#import <Foundation/Foundation.h>
+ at interface Regular : NSObject
+ at end
+
+//--- Frameworks/RegularHider.framework/Modules/module.modulemap
+framework module RegularHider {
+  header "Visible.h"
+  export *
+
+  explicit module Hidden {
+    header "Hidden.h"
+    export *
+  }
+}
+
+//--- test.m
+
+#if HIDDEN_FIRST
+#import <RegularHider/Visible.h>
+#import <Regular/Regular.h>
+#else
+#import <Regular/Regular.h>
+#import <RegularHider/Visible.h>
+#endif
+
+ at interface SubClass : Regular
+ at end
Index: clang/lib/Serialization/ASTReaderDecl.cpp
===================================================================
--- clang/lib/Serialization/ASTReaderDecl.cpp
+++ clang/lib/Serialization/ASTReaderDecl.cpp
@@ -1181,6 +1181,7 @@
   if (DD.Definition != NewDD.Definition) {
     Reader.MergedDeclContexts.insert(
         std::make_pair(NewDD.Definition, DD.Definition));
+    Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
   }
 
   // FIXME: odr checking?


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D110453.374980.patch
Type: text/x-patch
Size: 2336 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210924/f4280f51/attachment.bin>


More information about the cfe-commits mailing list