Skip to content

Commit

Permalink
[modules] Update visibility for merged ObjCInterfaceDecl definitions.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
vsapsai committed Oct 21, 2021
1 parent f5ee1ac commit 048d2c7
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 0 deletions.
1 change: 1 addition & 0 deletions clang/lib/Serialization/ASTReaderDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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?
Expand Down
61 changes: 61 additions & 0 deletions clang/test/Modules/merge-objc-interface-visibility.m
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 048d2c7

Please sign in to comment.