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