52 lines
1.5 KiB
C++
52 lines
1.5 KiB
C++
// Ensure that implicit methods aren't instrumented.
|
|
|
|
// 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
|
|
|
|
// Implicit constructors are generated for Base. We should not emit counters
|
|
// for them.
|
|
// CHECK-DAG: define {{.*}}_ZN4BaseC2Ev
|
|
// CHECK-DAG: define {{.*}}_ZN4BaseC2ERKS_
|
|
// CHECK-DAG: define {{.*}}_ZN4BaseC2EOS_
|
|
// CHECK-DAG: __profc__ZN7DerivedC2Ev,
|
|
// CHECK-DAG: __profc__ZN7DerivedC2ERKS_
|
|
// CHECK-DAG: __profc__ZN7DerivedC2EOS_
|
|
// CHECK-NOT: @__profc__ZN4BaseC2Ev =
|
|
// CHECK-NOT: @__profc__ZN4BaseC2ERKS_
|
|
// CHECK-NOT: @__profc__ZN4BaseC2EOS_
|
|
//
|
|
// Implicit assignment operators are generated for Base. We should not emit counters
|
|
// for them.
|
|
// CHECK-NOT: @__profc__ZN4BaseaSEOS_
|
|
// CHECK-NOT: @__profc__ZN4BaseaSERKS_
|
|
|
|
struct BaseBase {
|
|
BaseBase();
|
|
BaseBase(const BaseBase &);
|
|
BaseBase &operator=(const BaseBase &);
|
|
BaseBase &operator=(BaseBase &&);
|
|
};
|
|
|
|
struct Base : public BaseBase {
|
|
virtual void foo();
|
|
};
|
|
|
|
struct Derived : public Base {
|
|
Derived();
|
|
Derived(const Derived &);
|
|
Derived(Derived &&);
|
|
Derived &operator=(const Derived &);
|
|
Derived &operator=(Derived &&);
|
|
};
|
|
|
|
Derived::Derived() {}
|
|
Derived::Derived(const Derived &d) : Base(d) {}
|
|
Derived::Derived(Derived &&d) : Base(static_cast<Base&&>(d)) {}
|
|
Derived& Derived::operator=(const Derived &d) {
|
|
Base::operator=(d);
|
|
return *this;
|
|
}
|
|
Derived& Derived::operator=(Derived &&d) {
|
|
Base::operator=(static_cast<Base &&>(d));
|
|
return *this;
|
|
}
|