diff options
Diffstat (limited to 'test/CodeGenCXX/lifetime-asan.cpp')
| -rw-r--r-- | test/CodeGenCXX/lifetime-asan.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/test/CodeGenCXX/lifetime-asan.cpp b/test/CodeGenCXX/lifetime-asan.cpp new file mode 100644 index 0000000000000..9ccb28c876a1b --- /dev/null +++ b/test/CodeGenCXX/lifetime-asan.cpp @@ -0,0 +1,42 @@ +// RUN: %clang -target x86_64-linux-gnu -S -emit-llvm -o - -fno-exceptions -O0 %s | FileCheck %s -check-prefixes=CHECK,CHECK-O0 --implicit-check-not=llvm.lifetime +// RUN: %clang -target x86_64-linux-gnu -S -emit-llvm -o - -fno-exceptions -O0 \ +// RUN: -fsanitize=address -fsanitize-address-use-after-scope %s | \ +// RUN: FileCheck %s -check-prefixes=CHECK,CHECK-ASAN-USE-AFTER-SCOPE + +extern int bar(char *A, int n); + +struct X { X(); ~X(); int *p; }; +struct Y { Y(); int *p; }; + +extern "C" void a(), b(), c(), d(); + +// CHECK-LABEL: @_Z3foo +void foo(int n) { + // CHECK: call void @a() + a(); + + // CHECK: call void @b() + // CHECK-ASAN-USE-AFTER-SCOPE: store i1 false + // CHECK-ASAN-USE-AFTER-SCOPE: store i1 false + // CHECK: br i1 + // + // CHECK-ASAN-USE-AFTER-SCOPE: @llvm.lifetime.start + // CHECK-ASAN-USE-AFTER-SCOPE: store i1 true + // CHECK: call void @_ZN1XC + // CHECK: br label + // + // CHECK-ASAN-USE-AFTER-SCOPE: @llvm.lifetime.start + // CHECK-ASAN-USE-AFTER-SCOPE: store i1 true + // CHECK: call void @_ZN1YC + // CHECK: br label + // + // CHECK: call void @c() + // CHECK-ASAN-USE-AFTER-SCOPE: br i1 + // CHECK-ASAN-USE-AFTER-SCOPE: @llvm.lifetime.end + // CHECK-ASAN-USE-AFTER-SCOPE: br i1 + // CHECK-ASAN-USE-AFTER-SCOPE: @llvm.lifetime.end + b(), (n ? X().p : Y().p), c(); + + // CHECK: call void @d() + d(); +} |
