Home | History | Annotate | Download | only in CodeGenCXX
      1 // RUN: %clang_cc1 -fsanitize=memory -O0 -fsanitize-memory-use-after-dtor -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s
      2 // RUN: %clang_cc1 -fsanitize=memory -O1 -fsanitize-memory-use-after-dtor -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s
      3 
      4 template <class T>
      5 class Vector {
      6 public:
      7   int size;
      8   ~Vector() {
      9     size += 1;
     10   }
     11 };
     12 
     13 struct Base {
     14   int b1;
     15   double b2;
     16   Base() {
     17     b1 = 5;
     18     b2 = 10.989;
     19   }
     20   virtual ~Base() {}
     21 };
     22 
     23 struct VirtualBase {
     24   int vb1;
     25   int vb2;
     26   VirtualBase() {
     27     vb1 = 10;
     28     vb2 = 11;
     29   }
     30   virtual ~VirtualBase() {}
     31 };
     32 
     33 struct Derived : public Base, public virtual VirtualBase {
     34   int d1;
     35   Vector<int> v;
     36   int d2;
     37   Derived() {
     38     d1 = 10;
     39   }
     40   ~Derived() {}
     41 };
     42 
     43 Derived d;
     44 
     45 // Destruction order:
     46 // Derived: int, Vector, Base, VirtualBase
     47 
     48 // CHECK-LABEL: define {{.*}}ZN7DerivedD1Ev
     49 // CHECK: call void {{.*}}ZN11VirtualBaseD2Ev
     50 // CHECK: ret void
     51 
     52 // CHECK-LABEL: define {{.*}}ZN7DerivedD0Ev
     53 // CHECK: ret void
     54 
     55 // CHECK-LABEL: define {{.*}}ZN11VirtualBaseD1Ev
     56 // CHECK: ret void
     57 
     58 // CHECK-LABEL: define {{.*}}ZN11VirtualBaseD0Ev
     59 // CHECK: ret void
     60 
     61 // poison 2 ints
     62 // CHECK-LABEL: define {{.*}}ZN11VirtualBaseD2Ev
     63 // CHECK: call void {{.*}}sanitizer_dtor_callback({{.*}}, i64 8)
     64 // CHECK: ret void
     65 
     66 // poison int and double
     67 // CHECK-LABEL: define {{.*}}ZN4BaseD2Ev
     68 // CHECK: call void {{.*}}sanitizer_dtor_callback({{.*}}, i64 16)
     69 // CHECK: ret void
     70 
     71 // poison int, ignore vector, poison int
     72 // CHECK-LABEL: define {{.*}}ZN7DerivedD2Ev
     73 // CHECK: call void {{.*}}ZN6VectorIiED1Ev
     74 // CHECK: call void {{.*}}sanitizer_dtor_callback({{.*}}, i64 4)
     75 // CHECK: call void {{.*}}sanitizer_dtor_callback({{.*}}, i64 4)
     76 // CHECK: call void {{.*}}ZN4BaseD2Ev
     77 // CHECK: ret void
     78 
     79 // poison int
     80 // CHECK-LABEL: define {{.*}}ZN6VectorIiED2Ev
     81 // CHECK: call void {{.*}}sanitizer_dtor_callback({{.*}}, i64 4)
     82 // CHECK: ret void
     83