blob: 15ec3a9141ed7a297b4fdce086ab9d1734127c81 [file] [log] [blame]
Vitaly Bukac34b7aa2019-08-24 01:31:38 +00001// RUN: %clang -w -target x86_64-linux-gnu -S -emit-llvm -o - -fno-exceptions -O0 %s | \
2// RUN: FileCheck %s -check-prefixes=CHECK,CHECK-O0 --implicit-check-not=llvm.lifetime
3// RUN: %clang -w -target x86_64-linux-gnu -S -emit-llvm -o - -fno-exceptions -O0 \
4// RUN: -fsanitize=address -fsanitize-address-use-after-scope %s | \
5// RUN: FileCheck %s -check-prefixes=CHECK,LIFETIME
Vitaly Bukaaeca5692019-08-26 22:15:50 +00006// RUN: %clang -w -target x86_64-linux-gnu -S -emit-llvm -o - -fno-exceptions -O0 \
7// RUN: -fsanitize=memory %s | \
8// RUN: FileCheck %s -check-prefixes=CHECK,LIFETIME
Vitaly Buka669d1112019-08-26 22:16:05 +00009// RUN: %clang -w -target aarch64-linux-gnu -S -emit-llvm -o - -fno-exceptions -O0 \
10// RUN: -fsanitize=hwaddress %s | \
11// RUN: FileCheck %s -check-prefixes=CHECK,LIFETIME
Vitaly Bukac34b7aa2019-08-24 01:31:38 +000012
13extern int bar(char *A, int n);
14
15struct X {
16 X();
17 ~X();
18 int *p;
19};
20struct Y {
21 Y();
22 int *p;
23};
24
25extern "C" void a(), b(), c(), d();
26
Vitaly Bukaa8e8dd92019-08-27 00:11:33 +000027// CHECK: define dso_local void @_Z3fooi(i32 %[[N:[^)]+]])
Vitaly Bukac34b7aa2019-08-24 01:31:38 +000028void foo(int n) {
Vitaly Bukaa8e8dd92019-08-27 00:11:33 +000029 // CHECK: store i32 %[[N]], i32* %[[NADDR:[^,]+]]
Vitaly Bukac34b7aa2019-08-24 01:31:38 +000030 // CHECK-LABEL: call void @a()
31 a();
32
33 // CHECK-LABEL: call void @b()
Vitaly Bukaa8e8dd92019-08-27 00:11:33 +000034 // CHECK: [[NARG:%[^ ]+]] = load i32, i32* %[[NADDR]]
35 // CHECK: [[BOOL:%[^ ]+]] = icmp ne i32 [[NARG]], 0
Vitaly Bukac34b7aa2019-08-24 01:31:38 +000036 // CHECK: store i1 false
Vitaly Bukaa8e8dd92019-08-27 00:11:33 +000037 // CHECK: br i1 [[BOOL]], label %[[ONTRUE:[^,]+]], label %[[ONFALSE:[^,]+]]
Vitaly Bukac34b7aa2019-08-24 01:31:38 +000038 //
Vitaly Bukaa8e8dd92019-08-27 00:11:33 +000039 // CHECK: [[ONTRUE]]:
Vitaly Bukac34b7aa2019-08-24 01:31:38 +000040 // LIFETIME: @llvm.lifetime.start
41 // LIFETIME: store i1 true
42 // LIFETIME: call void @_ZN1XC
Vitaly Bukaa8e8dd92019-08-27 00:11:33 +000043 // CHECK: br label %[[END:[^,]+]]
Vitaly Bukac34b7aa2019-08-24 01:31:38 +000044 //
Vitaly Bukaa8e8dd92019-08-27 00:11:33 +000045 // CHECK: [[ONFALSE]]:
Vitaly Bukac34b7aa2019-08-24 01:31:38 +000046 // LIFETIME: @llvm.lifetime.start
47 // LIFETIME: store i1 true
48 // LIFETIME: call void @_ZN1YC
Vitaly Bukaa8e8dd92019-08-27 00:11:33 +000049 // CHECK: br label %[[END]]
Vitaly Bukac34b7aa2019-08-24 01:31:38 +000050 //
Vitaly Bukaa8e8dd92019-08-27 00:11:33 +000051 // CHECK: [[END]]:
Vitaly Bukac34b7aa2019-08-24 01:31:38 +000052 // CHECK: call void @c()
53 // LIFETIME: @llvm.lifetime.end
54 // LIFETIME: @llvm.lifetime.end
55 b(), (n ? X().p : Y().p), c();
56
57 // CHECK: call void @d()
58 d();
59}