Clang Project

clang_source_code/test/CodeGenCXX/sanitize-dtor-tail-call.cpp
1// Test -fsanitize-memory-use-after-dtor
2// RUN: %clang_cc1 -fsanitize=memory -fsanitize-memory-use-after-dtor -disable-llvm-passes -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s
3// RUN: %clang_cc1 -O1 -fsanitize=memory -fsanitize-memory-use-after-dtor -disable-llvm-passes -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s
4
5struct Simple {
6  int x_;
7  Simple() {
8    x_ = 5;
9  }
10  ~Simple() {
11    x_ += 1;
12  }
13};
14
15Simple s;
16// Simple internal member is poisoned by compiler-generated dtor
17// CHECK: define {{.*}}SimpleD2Ev{{.*}} [[ATTRIBUTE:#[0-9]+]]
18// CHECK: {{^ *}}call void @__sanitizer_dtor_callback
19// CHECK-NOT: call void @__sanitizer_dtor_callback
20// CHECK: ret void
21
22// Destructor does not emit any tail calls
23// CHECK: attributes [[ATTRIBUTE]] = {{.*}}"disable-tail-calls"="true"
24