Per review feedback the name was wrong and it can be used outside Objective-C. Unfortunately, making the internal struct visible broke some ASTMatchers tests that assumed that the first record decl would be from user code, rather than a builtin type. I'm worried that this will also affect users' code. So this patch adds a typedef to wrap the internal struct and only makes the typedef visible to namelookup. This is sufficient to allow the ASTReader to merge the decls we need without making the struct itself visible. rdar://problem/24425801 llvm-svn: 259734
43 lines
1.3 KiB
Objective-C
43 lines
1.3 KiB
Objective-C
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s
|
|
// rdar://13598026
|
|
|
|
@interface NSObject @end
|
|
|
|
@class NSString;
|
|
|
|
int __CFConstantStringClassReference[24];
|
|
|
|
@interface Bar : NSObject
|
|
+(void)format:(NSString *)format,...;
|
|
@end
|
|
|
|
@interface Foo : NSObject
|
|
@end
|
|
|
|
|
|
static inline void _inlineFunction() {
|
|
[Bar format:@" "];
|
|
}
|
|
|
|
@implementation Foo
|
|
|
|
|
|
+(NSString *)someMethod {
|
|
return @"";
|
|
}
|
|
|
|
-(void)someMethod {
|
|
_inlineFunction();
|
|
}
|
|
@end
|
|
|
|
// CHECK: @__CFConstantStringClassReference = common global [24 x i32] zeroinitializer, align 16
|
|
// CHECK: @_unnamed_cfstring_{{.*}} = private constant %struct.__NSConstantString_tag { i32* getelementptr inbounds ([24 x i32], [24 x i32]* @__CFConstantStringClassReference, i32 0, i32 0)
|
|
|
|
// CHECK-LABEL: define internal void @_inlineFunction()
|
|
// CHECK: [[ZERO:%.*]] = load %struct._class_t*, %struct._class_t** @"OBJC_CLASSLIST_REFERENCES_
|
|
// CHECK-NEXT: [[ONE:%.*]] = load i8*, i8** @OBJC_SELECTOR_REFERENCES_
|
|
// CHECK-NEXT: [[TWO:%.*]] = bitcast %struct._class_t* [[ZERO]] to i8*
|
|
// CHECK-NEXT: call void (i8*, i8*, [[T:%.*]]*, ...) bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, [[T:%.*]]*, ...)*)(i8* [[TWO]], i8* [[ONE]], [[T:%.*]]* bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_{{.*}} to [[T:%.*]]*))
|
|
// CHECK-NEXT: ret void
|