Dan Gohman | b49bd27 | 2012-02-16 00:57:37 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fobjc-arc -fblocks -fexceptions -fobjc-exceptions -O2 -disable-llvm-optzns -o - %s | FileCheck %s |
| 2 | // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fobjc-arc -fblocks -fexceptions -fobjc-exceptions -O0 -disable-llvm-optzns -o - %s | FileCheck -check-prefix=NO-METADATA %s |
| 3 | // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fobjc-arc -fblocks -fexceptions -fobjc-exceptions -O2 -disable-llvm-optzns -o - %s -fobjc-arc-exceptions | FileCheck -check-prefix=NO-METADATA %s |
| 4 | |
| 5 | // The front-end should emit clang.arc.no_objc_arc_exceptions in -fobjc-arc-exceptions |
| 6 | // mode when optimization is enabled, and not otherwise. |
| 7 | |
| 8 | void thrower(void); |
| 9 | void not(void) __attribute__((nothrow)); |
| 10 | |
| 11 | // CHECK: define void @test0( |
Dan Gohman | c7b55fc | 2012-02-16 18:51:05 +0000 | [diff] [blame] | 12 | // CHECK: call void @thrower(), !clang.arc.no_objc_arc_exceptions ! |
| 13 | // CHECK: call void @not() nounwind, !clang.arc.no_objc_arc_exceptions ! |
Dan Gohman | b49bd27 | 2012-02-16 00:57:37 +0000 | [diff] [blame] | 14 | // NO-METADATA: define void @test0( |
| 15 | // NO-METADATA-NOT: !clang.arc.no_objc_arc_exceptions |
| 16 | // NO-METADATA: } |
| 17 | void test0(void) { |
| 18 | thrower(); |
| 19 | not(); |
| 20 | } |
| 21 | |
| 22 | // CHECK: define void @test1( |
Dan Gohman | c7b55fc | 2012-02-16 18:51:05 +0000 | [diff] [blame] | 23 | // CHECK: call void @thrower(), !clang.arc.no_objc_arc_exceptions ! |
| 24 | // CHECK: call void @not() nounwind, !clang.arc.no_objc_arc_exceptions ! |
Dan Gohman | b49bd27 | 2012-02-16 00:57:37 +0000 | [diff] [blame] | 25 | // NO-METADATA: define void @test1( |
| 26 | // NO-METADATA-NOT: !clang.arc.no_objc_arc_exceptions |
| 27 | // NO-METADATA: } |
| 28 | void test1(id x) { |
| 29 | id y = x; |
| 30 | thrower(); |
| 31 | not(); |
| 32 | } |
| 33 | |
| 34 | void NSLog(id, ...); |
| 35 | |
| 36 | // CHECK: define void @test2( |
Dan Gohman | c7b55fc | 2012-02-16 18:51:05 +0000 | [diff] [blame] | 37 | // CHECK: invoke void (i8*, ...)* @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring_ to i8*), i32* %{{.*}}) |
| 38 | // CHECK: to label %{{.*}} unwind label %{{.*}}, !clang.arc.no_objc_arc_exceptions ! |
Dan Gohman | b49bd27 | 2012-02-16 00:57:37 +0000 | [diff] [blame] | 39 | // NO-METADATA: define void @test2( |
| 40 | // NO-METADATA-NOT: !clang.arc.no_objc_arc_exceptions |
| 41 | // NO-METADATA: } |
| 42 | void test2(void) { |
| 43 | @autoreleasepool { |
| 44 | __attribute__((__blocks__(byref))) int x; |
| 45 | NSLog(@"Address of x outside of block: %p", &x); |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | // CHECK: define void @test3( |
Dan Gohman | c7b55fc | 2012-02-16 18:51:05 +0000 | [diff] [blame] | 50 | // CHECK: invoke void %{{.*}}(i8* %{{.*}}) |
| 51 | // CHECK: to label %{{.*}} unwind label %{{.*}}, !clang.arc.no_objc_arc_exceptions ! |
Dan Gohman | b49bd27 | 2012-02-16 00:57:37 +0000 | [diff] [blame] | 52 | // NO-METADATA: define void @test3( |
| 53 | // NO-METADATA-NOT: !clang.arc.no_objc_arc_exceptions |
| 54 | // NO-METADATA: } |
| 55 | void test3(void) { |
| 56 | @autoreleasepool { |
| 57 | __attribute__((__blocks__(byref))) int x; |
| 58 | ^{ |
| 59 | NSLog(@"Address of x in non-assigned block: %p", &x); |
| 60 | }(); |
| 61 | } |
| 62 | } |
| 63 | |
| 64 | // CHECK: define void @test4( |
Dan Gohman | c7b55fc | 2012-02-16 18:51:05 +0000 | [diff] [blame] | 65 | // CHECK: invoke void %{{.*}}(i8* %{{.*}}) |
| 66 | // CHECK: to label %{{.*}} unwind label %{{.*}}, !clang.arc.no_objc_arc_exceptions ! |
Dan Gohman | b49bd27 | 2012-02-16 00:57:37 +0000 | [diff] [blame] | 67 | // NO-METADATA: define void @test4( |
| 68 | // NO-METADATA-NOT: !clang.arc.no_objc_arc_exceptions |
| 69 | // NO-METADATA: } |
| 70 | void test4(void) { |
| 71 | @autoreleasepool { |
| 72 | __attribute__((__blocks__(byref))) int x; |
| 73 | void (^b)(void) = ^{ |
| 74 | NSLog(@"Address of x in assigned block: %p", &x); |
| 75 | }; |
| 76 | b(); |
| 77 | } |
| 78 | } |