1 | // RUN: %clang_cc1 -x objective-c -triple x86_64-apple-darwin10 -fblocks -emit-llvm %s -o - | FileCheck %s |
2 | // RUN: %clang_cc1 -x objective-c++ -triple x86_64-apple-darwin10 -fblocks -emit-llvm %s -o - | FileCheck %s |
3 | // rdar://10111397 |
4 | |
5 | #if __has_feature(objc_bool) |
6 | #define YES __objc_yes |
7 | #define NO __objc_no |
8 | #else |
9 | #define YES ((BOOL)1) |
10 | #define NO ((BOOL)0) |
11 | #endif |
12 | |
13 | #if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 |
14 | typedef unsigned long NSUInteger; |
15 | typedef long NSInteger; |
16 | #else |
17 | typedef unsigned int NSUInteger; |
18 | typedef int NSInteger; |
19 | #endif |
20 | typedef signed char BOOL; |
21 | |
22 | @interface NSNumber @end |
23 | |
24 | @interface NSNumber (NSNumberCreation) |
25 | #if __has_feature(objc_array_literals) |
26 | + (NSNumber *)numberWithChar:(char)value; |
27 | + (NSNumber *)numberWithUnsignedChar:(unsigned char)value; |
28 | + (NSNumber *)numberWithShort:(short)value; |
29 | + (NSNumber *)numberWithUnsignedShort:(unsigned short)value; |
30 | + (NSNumber *)numberWithInt:(int)value; |
31 | + (NSNumber *)numberWithUnsignedInt:(unsigned int)value; |
32 | + (NSNumber *)numberWithLong:(long)value; |
33 | + (NSNumber *)numberWithUnsignedLong:(unsigned long)value; |
34 | + (NSNumber *)numberWithLongLong:(long long)value; |
35 | + (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value; |
36 | + (NSNumber *)numberWithFloat:(float)value; |
37 | + (NSNumber *)numberWithDouble:(double)value; |
38 | + (NSNumber *)numberWithBool:(BOOL)value; |
39 | + (NSNumber *)numberWithInteger:(NSInteger)value ; |
40 | + (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value ; |
41 | #endif |
42 | @end |
43 | |
44 | @interface NSDate |
45 | + (NSDate *) date; |
46 | @end |
47 | |
48 | #if __has_feature(objc_dictionary_literals) |
49 | @interface NSDictionary |
50 | + (id)dictionaryWithObjects:(const id [])objects forKeys:(const id [])keys count:(NSUInteger)cnt; |
51 | @end |
52 | #endif |
53 | |
54 | id NSUserName(); |
55 | |
56 | // CHECK: define i32 @main() [[NUW:#[0-9]+]] |
57 | int main() { |
58 | // CHECK: call{{.*}}@objc_msgSend{{.*}}i8 signext 97 |
59 | NSNumber *aNumber = @'a'; |
60 | // CHECK: call{{.*}}@objc_msgSend{{.*}}i32 42 |
61 | NSNumber *fortyTwo = @42; |
62 | // CHECK: call{{.*}}@objc_msgSend{{.*}}i32 -42 |
63 | NSNumber *negativeFortyTwo = @-42; |
64 | // CHECK: call{{.*}}@objc_msgSend{{.*}}i32 42 |
65 | NSNumber *positiveFortyTwo = @+42; |
66 | // CHECK: call{{.*}}@objc_msgSend{{.*}}i32 42 |
67 | NSNumber *fortyTwoUnsigned = @42u; |
68 | // CHECK: call{{.*}}@objc_msgSend{{.*}}i64 42 |
69 | NSNumber *fortyTwoLong = @42l; |
70 | // CHECK: call{{.*}}@objc_msgSend{{.*}}i64 42 |
71 | NSNumber *fortyTwoLongLong = @42ll; |
72 | // CHECK: call{{.*}}@objc_msgSend{{.*}}float 0x400921FB60000000 |
73 | NSNumber *piFloat = @3.141592654f; |
74 | // CHECK: call{{.*}}@objc_msgSend{{.*}}double 0x400921FB54411744 |
75 | NSNumber *piDouble = @3.1415926535; |
76 | // CHECK: call{{.*}}@objc_msgSend{{.*}}i8 signext 1 |
77 | NSNumber *yesNumber = @__objc_yes; |
78 | // CHECK: call{{.*}}@objc_msgSend{{.*}}i8 signext 0 |
79 | NSNumber *noNumber = @__objc_no; |
80 | // CHECK: call{{.*}}@objc_msgSend{{.*}}i8 signext 1 |
81 | NSNumber *yesNumber1 = @YES; |
82 | // CHECK: call{{.*}}@objc_msgSend{{.*}}i8 signext 0 |
83 | NSNumber *noNumber1 = @NO; |
84 | NSDictionary *dictionary = @{@"name" : NSUserName(), |
85 | @"date" : [NSDate date] }; |
86 | return __objc_yes == __objc_no; |
87 | } |
88 | |
89 | // rdar://10579122 |
90 | typedef BOOL (^foo)(void); |
91 | extern void bar(foo a); |
92 | |
93 | void baz(void) { |
94 | bar(^(void) { return YES; }); |
95 | } |
96 | |
97 | // CHECK: attributes [[NUW]] = { noinline {{(norecurse )?}}nounwind{{.*}} } |
98 | |