13212b18bSJustin Bogner // Ensure that implicit methods aren't instrumented. 23212b18bSJustin Bogner 3*55adc9ddSXinliang David 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 43212b18bSJustin Bogner 5*55adc9ddSXinliang David Li // Implicit constructors are generated for Base. We should not emit counters 6*55adc9ddSXinliang David Li // for them. 7*55adc9ddSXinliang David Li // CHECK-DAG: define {{.*}}_ZN4BaseC2Ev 8*55adc9ddSXinliang David Li // CHECK-DAG: define {{.*}}_ZN4BaseC2ERKS_ 9*55adc9ddSXinliang David Li // CHECK-DAG: define {{.*}}_ZN4BaseC2EOS_ 10*55adc9ddSXinliang David Li // CHECK-DAG: __profc__ZN7DerivedC2Ev, 11*55adc9ddSXinliang David Li // CHECK-DAG: __profc__ZN7DerivedC2ERKS_ 12*55adc9ddSXinliang David Li // CHECK-DAG: __profc__ZN7DerivedC2EOS_ 13ddbdb1e0SXinliang David Li // CHECK-NOT: @__profc__ZN4BaseC2Ev = 14*55adc9ddSXinliang David Li // CHECK-NOT: @__profc__ZN4BaseC2ERKS_ 15*55adc9ddSXinliang David Li // CHECK-NOT: @__profc__ZN4BaseC2EOS_ 16*55adc9ddSXinliang David Li // 17*55adc9ddSXinliang David Li // Implicit assignment operators are generated for Base. We should not emit counters 18*55adc9ddSXinliang David Li // for them. 19*55adc9ddSXinliang David Li // CHECK-NOT: @__profc__ZN4BaseaSEOS_ 20*55adc9ddSXinliang David Li // CHECK-NOT: @__profc__ZN4BaseaSERKS_ 213212b18bSJustin Bogner 22*55adc9ddSXinliang David Li struct BaseBase { 23*55adc9ddSXinliang David Li BaseBase(); 24*55adc9ddSXinliang David Li BaseBase(const BaseBase &); 25*55adc9ddSXinliang David Li BaseBase &operator=(const BaseBase &); 26*55adc9ddSXinliang David Li BaseBase &operator=(BaseBase &&); 27*55adc9ddSXinliang David Li }; 28*55adc9ddSXinliang David Li 29*55adc9ddSXinliang David Li struct Base : public BaseBase { 303212b18bSJustin Bogner virtual void foo(); 313212b18bSJustin Bogner }; 323212b18bSJustin Bogner 333212b18bSJustin Bogner struct Derived : public Base { 343212b18bSJustin Bogner Derived(); 35*55adc9ddSXinliang David Li Derived(const Derived &); 36*55adc9ddSXinliang David Li Derived(Derived &&); 37*55adc9ddSXinliang David Li Derived &operator=(const Derived &); 38*55adc9ddSXinliang David Li Derived &operator=(Derived &&); 393212b18bSJustin Bogner }; 403212b18bSJustin Bogner Derived()413212b18bSJustin BognerDerived::Derived() {} Derived(const Derived & d)42*55adc9ddSXinliang David LiDerived::Derived(const Derived &d) : Base(d) {} Derived(Derived && d)43*55adc9ddSXinliang David LiDerived::Derived(Derived &&d) : Base(static_cast<Base&&>(d)) {} operator =(const Derived & d)44*55adc9ddSXinliang David LiDerived& Derived::operator=(const Derived &d) { 45*55adc9ddSXinliang David Li Base::operator=(d); 46*55adc9ddSXinliang David Li return *this; 47*55adc9ddSXinliang David Li } operator =(Derived && d)48*55adc9ddSXinliang David LiDerived& Derived::operator=(Derived &&d) { 49*55adc9ddSXinliang David Li Base::operator=(static_cast<Base &&>(d)); 50*55adc9ddSXinliang David Li return *this; 51*55adc9ddSXinliang David Li } 52