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