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 LiDerived::Derived() {} Derived(const Derived & d)42*67e74705SXin LiDerived::Derived(const Derived &d) : Base(d) {} Derived(Derived && d)43*67e74705SXin LiDerived::Derived(Derived &&d) : Base(static_cast<Base&&>(d)) {} operator =(const Derived & d)44*67e74705SXin LiDerived& Derived::operator=(const Derived &d) { 45*67e74705SXin Li Base::operator=(d); 46*67e74705SXin Li return *this; 47*67e74705SXin Li } operator =(Derived && d)48*67e74705SXin LiDerived& Derived::operator=(Derived &&d) { 49*67e74705SXin Li Base::operator=(static_cast<Base &&>(d)); 50*67e74705SXin Li return *this; 51*67e74705SXin Li } 52