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 +@interface NSObject +@end + +//--- Frameworks/Foundation.framework/Modules/module.modulemap +framework module Foundation { + header "Foundation.h" + export * +} + +//--- Frameworks/Regular.framework/Headers/Regular.h +#import <Foundation/Foundation.h> +@interface Regular : NSObject +@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> +@interface Regular : NSObject +@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 + +@interface SubClass : Regular +@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?
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 +@interface NSObject +@end + +//--- Frameworks/Foundation.framework/Modules/module.modulemap +framework module Foundation { + header "Foundation.h" + export * +} + +//--- Frameworks/Regular.framework/Headers/Regular.h +#import <Foundation/Foundation.h> +@interface Regular : NSObject +@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> +@interface Regular : NSObject +@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 + +@interface SubClass : Regular +@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?
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits