xref: /aosp_15_r20/external/clang/test/Profile/cxx-implicit.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // Ensure that implicit methods aren't instrumented.
2*67e74705SXin Li 
3*67e74705SXin 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
4*67e74705SXin Li 
5*67e74705SXin Li // Implicit constructors are generated for Base. We should not emit counters
6*67e74705SXin Li // for them.
7*67e74705SXin Li // CHECK-DAG: define {{.*}}_ZN4BaseC2Ev
8*67e74705SXin Li // CHECK-DAG: define {{.*}}_ZN4BaseC2ERKS_
9*67e74705SXin Li // CHECK-DAG: define {{.*}}_ZN4BaseC2EOS_
10*67e74705SXin Li // CHECK-DAG: __profc__ZN7DerivedC2Ev,
11*67e74705SXin Li // CHECK-DAG: __profc__ZN7DerivedC2ERKS_
12*67e74705SXin Li // CHECK-DAG: __profc__ZN7DerivedC2EOS_
13*67e74705SXin Li // CHECK-NOT: @__profc__ZN4BaseC2Ev =
14*67e74705SXin Li // CHECK-NOT: @__profc__ZN4BaseC2ERKS_
15*67e74705SXin Li // CHECK-NOT: @__profc__ZN4BaseC2EOS_
16*67e74705SXin Li //
17*67e74705SXin Li // Implicit assignment operators are generated for Base. We should not emit counters
18*67e74705SXin Li // for them.
19*67e74705SXin Li // CHECK-NOT: @__profc__ZN4BaseaSEOS_
20*67e74705SXin Li // CHECK-NOT: @__profc__ZN4BaseaSERKS_
21*67e74705SXin Li 
22*67e74705SXin Li struct BaseBase {
23*67e74705SXin Li  BaseBase();
24*67e74705SXin Li  BaseBase(const BaseBase &);
25*67e74705SXin Li  BaseBase &operator=(const BaseBase &);
26*67e74705SXin Li  BaseBase &operator=(BaseBase &&);
27*67e74705SXin Li };
28*67e74705SXin Li 
29*67e74705SXin Li struct Base : public BaseBase {
30*67e74705SXin Li   virtual void foo();
31*67e74705SXin Li };
32*67e74705SXin Li 
33*67e74705SXin Li struct Derived : public Base {
34*67e74705SXin Li   Derived();
35*67e74705SXin Li   Derived(const Derived &);
36*67e74705SXin Li   Derived(Derived &&);
37*67e74705SXin Li   Derived &operator=(const Derived &);
38*67e74705SXin Li   Derived &operator=(Derived &&);
39*67e74705SXin Li };
40*67e74705SXin Li 
Derived()41*67e74705SXin Li Derived::Derived() {}
Derived(const Derived & d)42*67e74705SXin Li Derived::Derived(const Derived &d) : Base(d) {}
Derived(Derived && d)43*67e74705SXin Li Derived::Derived(Derived &&d) : Base(static_cast<Base&&>(d)) {}
operator =(const Derived & d)44*67e74705SXin Li Derived& Derived::operator=(const Derived &d) {
45*67e74705SXin Li   Base::operator=(d);
46*67e74705SXin Li   return *this;
47*67e74705SXin Li }
operator =(Derived && d)48*67e74705SXin Li Derived& Derived::operator=(Derived &&d) {
49*67e74705SXin Li   Base::operator=(static_cast<Base &&>(d));
50*67e74705SXin Li   return *this;
51*67e74705SXin Li }
52