xref: /aosp_15_r20/external/clang/test/CodeGenObjC/arc-no-arc-exceptions.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
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