[PGO] Cover more cases of implicitly generated C++ methods

llvm-svn: 260161
This commit is contained in:
Xinliang David Li 2016-02-08 22:41:37 +00:00
parent d416747803
commit 55adc9ddcc
1 changed files with 38 additions and 4 deletions

View File

@ -1,17 +1,51 @@
// Ensure that implicit methods aren't instrumented.
// RUN: %clang_cc1 -x c++ %s -triple %itanium_abi_triple -main-file-name cxx-implicit.cpp -o - -emit-llvm -fprofile-instrument=clang | FileCheck %s
// 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
// An implicit constructor is generated for Base. We should not emit counters
// for it.
// 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 Base {
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;
}