Home | History | Annotate | Download | only in CodeGenCXX
      1 // RUN: %clang_cc1 -std=c++1y %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s
      2 // RUN: %clang_cc1 -std=c++11 -fsized-deallocation %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s
      3 // RUN: %clang_cc1 -std=c++11 %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-UNSIZED
      4 
      5 // CHECK-UNSIZED-NOT: _ZdlPvm
      6 // CHECK-UNSIZED-NOT: _ZdaPvm
      7 
      8 typedef decltype(sizeof(0)) size_t;
      9 
     10 typedef int A;
     11 struct B { int n; };
     12 struct C { ~C() {} };
     13 struct D { D(); virtual ~D() {} };
     14 struct E {
     15   void *operator new(size_t);
     16   void *operator new[](size_t);
     17   void operator delete(void *) noexcept;
     18   void operator delete[](void *) noexcept;
     19 };
     20 struct F {
     21   void *operator new(size_t);
     22   void *operator new[](size_t);
     23   void operator delete(void *, size_t) noexcept;
     24   void operator delete[](void *, size_t) noexcept;
     25 };
     26 
     27 template<typename T> T get();
     28 
     29 template<typename T>
     30 void del() {
     31   ::delete get<T*>();
     32   ::delete[] get<T*>();
     33   delete get<T*>();
     34   delete[] get<T*>();
     35 }
     36 
     37 template void del<A>();
     38 template void del<B>();
     39 template void del<C>();
     40 template void del<D>();
     41 template void del<E>();
     42 template void del<F>();
     43 
     44 D::D() {}
     45 
     46 // CHECK-LABEL: define weak_odr void @_Z3delIiEvv()
     47 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
     48 // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
     49 //
     50 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
     51 // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
     52 
     53 // CHECK-LABEL: define linkonce void @_ZdlPvm(i8*
     54 // CHECK: call void @_ZdlPv(i8* %0)
     55 
     56 // CHECK-LABEL: define weak_odr void @_Z3delI1BEvv()
     57 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
     58 // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
     59 //
     60 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
     61 // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
     62 
     63 // CHECK-LABEL: define weak_odr void @_Z3delI1CEvv()
     64 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
     65 // CHECK: mul i64 1, %{{[^ ]*}}
     66 // CHECK: add i64 %{{[^ ]*}}, 8
     67 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
     68 //
     69 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
     70 // CHECK: mul i64 1, %{{[^ ]*}}
     71 // CHECK: add i64 %{{[^ ]*}}, 8
     72 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
     73 
     74 // CHECK-LABEL: define linkonce void @_ZdaPvm(i8*
     75 // CHECK: call void @_ZdaPv(i8* %0)
     76 
     77 // CHECK-LABEL: define weak_odr void @_Z3delI1DEvv()
     78 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)
     79 // CHECK: mul i64 8, %{{[^ ]*}}
     80 // CHECK: add i64 %{{[^ ]*}}, 8
     81 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
     82 //
     83 // CHECK-NOT: Zdl
     84 // CHECK: call void %{{.*}}
     85 // CHECK-NOT: Zdl
     86 // CHECK: mul i64 8, %{{[^ ]*}}
     87 // CHECK: add i64 %{{[^ ]*}}, 8
     88 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
     89 
     90 // CHECK-LABEL: define weak_odr void @_Z3delI1EEvv()
     91 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
     92 // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
     93 //
     94 // CHECK: call void @_ZN1EdlEPv(i8* %{{[^ ]*}})
     95 // CHECK: call void @_ZN1EdaEPv(i8* %{{[^ ]*}})
     96 
     97 // CHECK-LABEL: define weak_odr void @_Z3delI1FEvv()
     98 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
     99 // CHECK: mul i64 1, %{{[^ ]*}}
    100 // CHECK: add i64 %{{[^ ]*}}, 8
    101 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
    102 //
    103 // CHECK: call void @_ZN1FdlEPvm(i8* %{{[^ ]*}}, i64 1)
    104 // CHECK: mul i64 1, %{{[^ ]*}}
    105 // CHECK: add i64 %{{[^ ]*}}, 8
    106 // CHECK: call void @_ZN1FdaEPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
    107 
    108 
    109 // CHECK-LABEL: define linkonce_odr void @_ZN1DD0Ev(%{{[^ ]*}}* %this)
    110 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)
    111