1// UNSUPPORTED: target={{.*}}-zos{{.*}}, target={{.*}}-aix{{.*}} 2// RUN: rm -rf %t 3// RUN: split-file %s %t 4// RUN: %clang_cc1 -emit-llvm -o %t/test.bc -F%t/Frameworks %t/test.m \ 5// RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/modules.cache 6// RUN: %clang_cc1 -emit-llvm -o %t/test.bc -F%t/Frameworks %t/test-functions.m \ 7// RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/modules.cache 8 9// Test a case when Objective-C interface ivars are present in two different modules. 10 11//--- Frameworks/Foundation.framework/Headers/Foundation.h 12@interface NSObject 13@end 14 15//--- Frameworks/Foundation.framework/Modules/module.modulemap 16framework module Foundation { 17 header "Foundation.h" 18 export * 19} 20 21//--- Frameworks/ObjCInterface.framework/Headers/ObjCInterface.h 22#import <Foundation/Foundation.h> 23@interface ObjCInterface : NSObject { 24@public 25 id _item; 26} 27@end 28 29@interface WithBitFields : NSObject { 30@public 31 int x: 3; 32 int y: 4; 33} 34@end 35 36//--- Frameworks/ObjCInterface.framework/Modules/module.modulemap 37framework module ObjCInterface { 38 header "ObjCInterface.h" 39 export * 40} 41 42//--- Frameworks/ObjCInterfaceCopy.framework/Headers/ObjCInterfaceCopy.h 43#import <Foundation/Foundation.h> 44@interface ObjCInterface : NSObject { 45@public 46 id _item; 47} 48@end 49 50@interface WithBitFields : NSObject { 51@public 52 int x: 3; 53 int y: 4; 54} 55@end 56 57// Inlined function present only in Copy.framework to make sure it uses decls from Copy module. 58__attribute__((always_inline)) void inlinedIVarAccessor(ObjCInterface *obj, WithBitFields *bitFields) { 59 obj->_item = 0; 60 bitFields->x = 0; 61} 62 63//--- Frameworks/ObjCInterfaceCopy.framework/Modules/module.modulemap 64framework module ObjCInterfaceCopy { 65 header "ObjCInterfaceCopy.h" 66 export * 67} 68 69//--- test.m 70#import <ObjCInterface/ObjCInterface.h> 71#import <ObjCInterfaceCopy/ObjCInterfaceCopy.h> 72 73@implementation ObjCInterface 74- (void)test:(id)item { 75 _item = item; 76} 77@end 78 79@implementation WithBitFields 80- (void)reset { 81 x = 0; 82 y = 0; 83} 84@end 85 86//--- test-functions.m 87#import <ObjCInterface/ObjCInterface.h> 88 89void testAccessIVar(ObjCInterface *obj, id item) { 90 obj->_item = item; 91} 92void testAccessBitField(WithBitFields *obj) { 93 obj->x = 0; 94} 95 96#import <ObjCInterfaceCopy/ObjCInterfaceCopy.h> 97 98void testAccessIVarLater(ObjCInterface *obj, id item) { 99 obj->_item = item; 100} 101void testAccessBitFieldLater(WithBitFields *obj) { 102 obj->y = 0; 103} 104void testInlinedFunction(ObjCInterface *obj, WithBitFields *bitFields) { 105 inlinedIVarAccessor(obj, bitFields); 106} 107