[clang] 048d2c7 - [modules] Update visibility for merged ObjCInterfaceDecl definitions.

Volodymyr Sapsai via cfe-commits cfe-commits at lists.llvm.org
Thu Oct 21 15:07:00 PDT 2021


Author: Volodymyr Sapsai
Date: 2021-10-21T15:06:39-07:00
New Revision: 048d2c76efcddf4265987914e30d3d4f49395496

URL: https://github.com/llvm/llvm-project/commit/048d2c76efcddf4265987914e30d3d4f49395496
DIFF: https://github.com/llvm/llvm-project/commit/048d2c76efcddf4265987914e30d3d4f49395496.diff

LOG: [modules] Update visibility for merged ObjCInterfaceDecl definitions.

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

Differential Revision: https://reviews.llvm.org/D110453

Added: 
    clang/test/Modules/merge-objc-interface-visibility.m

Modified: 
    clang/lib/Serialization/ASTReaderDecl.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp
index 7aab708d00e4a..2a617a4fec116 100644
--- a/clang/lib/Serialization/ASTReaderDecl.cpp
+++ b/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -1181,6 +1181,7 @@ void ASTDeclReader::MergeDefinitionData(ObjCInterfaceDecl *D,
   if (DD.Definition != NewDD.Definition) {
     Reader.MergedDeclContexts.insert(
         std::make_pair(NewDD.Definition, DD.Definition));
+    Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
   }
 
   // FIXME: odr checking?

diff  --git a/clang/test/Modules/merge-objc-interface-visibility.m b/clang/test/Modules/merge-objc-interface-visibility.m
new file mode 100644
index 0000000000000..181a2c716c6b3
--- /dev/null
+++ b/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


        


More information about the cfe-commits mailing list