| // 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; | 
 | } |