xref: /llvm-project/clang/test/Profile/cxx-implicit.cpp (revision 55adc9ddcc5be3c009b8a9167bbf13109e2a9674)
13212b18bSJustin Bogner // Ensure that implicit methods aren't instrumented.
23212b18bSJustin Bogner 
3*55adc9ddSXinliang David Li // RUN: %clang_cc1 -x c++ -std=c++11 %s -triple %itanium_abi_triple -main-file-name cxx-implicit.cpp -o - -emit-llvm -fprofile-instrument=clang | FileCheck %s
43212b18bSJustin Bogner 
5*55adc9ddSXinliang David Li // Implicit constructors are generated for Base. We should not emit counters
6*55adc9ddSXinliang David Li // for them.
7*55adc9ddSXinliang David Li // CHECK-DAG: define {{.*}}_ZN4BaseC2Ev
8*55adc9ddSXinliang David Li // CHECK-DAG: define {{.*}}_ZN4BaseC2ERKS_
9*55adc9ddSXinliang David Li // CHECK-DAG: define {{.*}}_ZN4BaseC2EOS_
10*55adc9ddSXinliang David Li // CHECK-DAG: __profc__ZN7DerivedC2Ev,
11*55adc9ddSXinliang David Li // CHECK-DAG: __profc__ZN7DerivedC2ERKS_
12*55adc9ddSXinliang David Li // CHECK-DAG: __profc__ZN7DerivedC2EOS_
13ddbdb1e0SXinliang David Li // CHECK-NOT: @__profc__ZN4BaseC2Ev =
14*55adc9ddSXinliang David Li // CHECK-NOT: @__profc__ZN4BaseC2ERKS_
15*55adc9ddSXinliang David Li // CHECK-NOT: @__profc__ZN4BaseC2EOS_
16*55adc9ddSXinliang David Li //
17*55adc9ddSXinliang David Li // Implicit assignment operators are generated for Base. We should not emit counters
18*55adc9ddSXinliang David Li // for them.
19*55adc9ddSXinliang David Li // CHECK-NOT: @__profc__ZN4BaseaSEOS_
20*55adc9ddSXinliang David Li // CHECK-NOT: @__profc__ZN4BaseaSERKS_
213212b18bSJustin Bogner 
22*55adc9ddSXinliang David Li struct BaseBase {
23*55adc9ddSXinliang David Li  BaseBase();
24*55adc9ddSXinliang David Li  BaseBase(const BaseBase &);
25*55adc9ddSXinliang David Li  BaseBase &operator=(const BaseBase &);
26*55adc9ddSXinliang David Li  BaseBase &operator=(BaseBase &&);
27*55adc9ddSXinliang David Li };
28*55adc9ddSXinliang David Li 
29*55adc9ddSXinliang David Li struct Base : public BaseBase {
303212b18bSJustin Bogner   virtual void foo();
313212b18bSJustin Bogner };
323212b18bSJustin Bogner 
333212b18bSJustin Bogner struct Derived : public Base {
343212b18bSJustin Bogner   Derived();
35*55adc9ddSXinliang David Li   Derived(const Derived &);
36*55adc9ddSXinliang David Li   Derived(Derived &&);
37*55adc9ddSXinliang David Li   Derived &operator=(const Derived &);
38*55adc9ddSXinliang David Li   Derived &operator=(Derived &&);
393212b18bSJustin Bogner };
403212b18bSJustin Bogner 
Derived()413212b18bSJustin Bogner Derived::Derived() {}
Derived(const Derived & d)42*55adc9ddSXinliang David Li Derived::Derived(const Derived &d) : Base(d) {}
Derived(Derived && d)43*55adc9ddSXinliang David Li Derived::Derived(Derived &&d) : Base(static_cast<Base&&>(d)) {}
operator =(const Derived & d)44*55adc9ddSXinliang David Li Derived& Derived::operator=(const Derived &d) {
45*55adc9ddSXinliang David Li   Base::operator=(d);
46*55adc9ddSXinliang David Li   return *this;
47*55adc9ddSXinliang David Li }
operator =(Derived && d)48*55adc9ddSXinliang David Li Derived& Derived::operator=(Derived &&d) {
49*55adc9ddSXinliang David Li   Base::operator=(static_cast<Base &&>(d));
50*55adc9ddSXinliang David Li   return *this;
51*55adc9ddSXinliang David Li }
52