1*67e74705SXin Li // RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-linux -finline-functions -emit-llvm -disable-llvm-optzns -o - | FileCheck %s --check-prefix=CHECK --check-prefix=SUITABLE 2*67e74705SXin Li // RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-linux -finline-hint-functions -emit-llvm -disable-llvm-optzns -o - | FileCheck %s --check-prefix=CHECK --check-prefix=HINTED 3*67e74705SXin Li // RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-linux -fno-inline -emit-llvm -disable-llvm-optzns -o - | FileCheck %s --check-prefix=CHECK --check-prefix=NOINLINE 4*67e74705SXin Li 5*67e74705SXin Li // Force non-trivial implicit constructors/destructors/operators for B by having explicit ones for A 6*67e74705SXin Li struct A { AA7*67e74705SXin Li A() {} AA8*67e74705SXin Li A(const A&) {} operator =A9*67e74705SXin Li A& operator=(const A&) { return *this; } ~AA10*67e74705SXin Li ~A() {} 11*67e74705SXin Li }; 12*67e74705SXin Li 13*67e74705SXin Li struct B { 14*67e74705SXin Li A member; implicitFunctionB15*67e74705SXin Li int implicitFunction(int a) { return a + a; } 16*67e74705SXin Li inline int explicitFunction(int a); 17*67e74705SXin Li int noHintFunction(int a); optNoneFunctionB18*67e74705SXin Li __attribute__((optnone)) int optNoneFunction(int a) { return a + a; } implicitTplFunctionB19*67e74705SXin Li template<int N> int implicitTplFunction(int a) { return N + a; } explicitTplFunctionB20*67e74705SXin Li template<int N> inline int explicitTplFunction(int a) { return N + a; } 21*67e74705SXin Li template<int N> int noHintTplFunction(int a); 22*67e74705SXin Li template<int N> int explicitRedeclTplFunction(int a); 23*67e74705SXin Li }; 24*67e74705SXin Li explicitFunction(int a)25*67e74705SXin Liint B::explicitFunction(int a) { return a + a; } 26*67e74705SXin Li // CHECK: @_ZN1B14noHintFunctionEi({{.*}}) [[NOHINT_ATTR:#[0-9]+]] noHintFunction(int a)27*67e74705SXin Liint B::noHintFunction(int a) { return a + a; } 28*67e74705SXin Li 29*67e74705SXin Li // CHECK: @_ZN1B19implicitTplFunctionILi0EEEii({{.*}}) [[NOHINT_ATTR]] implicitTplFunction(int a)30*67e74705SXin Litemplate<> int B::implicitTplFunction<0>(int a) { return a + a; } 31*67e74705SXin Li // CHECK: @_ZN1B19explicitTplFunctionILi0EEEii({{.*}}) [[NOHINT_ATTR]] explicitTplFunction(int a)32*67e74705SXin Litemplate<> int B::explicitTplFunction<0>(int a) { return a + a; } 33*67e74705SXin Li // CHECK: @_ZN1B17noHintTplFunctionILi0EEEii({{.*}}) [[NOHINT_ATTR]] noHintTplFunction(int a)34*67e74705SXin Litemplate<> int B::noHintTplFunction<0>(int a) { return a + a; } implicitTplFunction(int a)35*67e74705SXin Litemplate<> inline int B::implicitTplFunction<1>(int a) { return a; } explicitTplFunction(int a)36*67e74705SXin Litemplate<> inline int B::explicitTplFunction<1>(int a) { return a; } noHintTplFunction(int a)37*67e74705SXin Litemplate<> inline int B::noHintTplFunction<1>(int a) { return a; } noHintTplFunction(int a)38*67e74705SXin Litemplate<int N> int B::noHintTplFunction(int a) { return N + a; } explicitRedeclTplFunction(int a)39*67e74705SXin Litemplate<int N> inline int B::explicitRedeclTplFunction(int a) { return N + a; } 40*67e74705SXin Li constexprFunction(int a)41*67e74705SXin Liconstexpr int constexprFunction(int a) { return a + a; } 42*67e74705SXin Li foo()43*67e74705SXin Livoid foo() 44*67e74705SXin Li { 45*67e74705SXin Li // CHECK: @_ZN1BC1Ev({{.*}}) unnamed_addr [[IMPLICIT_CONSTR_ATTR:#[0-9]+]] 46*67e74705SXin Li B b1; 47*67e74705SXin Li // CHECK: @_ZN1BC1ERKS_({{.*}}) unnamed_addr [[IMPLICIT_CONSTR_ATTR]] 48*67e74705SXin Li B b2(b1); 49*67e74705SXin Li // CHECK: @_ZN1BaSERKS_({{.*}}) [[IMPLICIT_CONSTR_ATTR]] 50*67e74705SXin Li b2 = b1; 51*67e74705SXin Li // CHECK: @_ZN1B16implicitFunctionEi({{.*}}) [[IMPLICIT_ATTR:#[0-9]+]] 52*67e74705SXin Li b1.implicitFunction(1); 53*67e74705SXin Li // CHECK: @_ZN1B16explicitFunctionEi({{.*}}) [[EXPLICIT_ATTR:#[0-9]+]] 54*67e74705SXin Li b1.explicitFunction(2); 55*67e74705SXin Li b1.noHintFunction(3); 56*67e74705SXin Li // CHECK: @_ZN1B15optNoneFunctionEi({{.*}}) [[OPTNONE_ATTR:#[0-9]+]] 57*67e74705SXin Li b1.optNoneFunction(4); 58*67e74705SXin Li // CHECK: @_Z17constexprFunctioni({{.*}}) [[IMPLICIT_ATTR]] 59*67e74705SXin Li constexprFunction(5); 60*67e74705SXin Li b1.implicitTplFunction<0>(6); 61*67e74705SXin Li // CHECK: @_ZN1B19implicitTplFunctionILi1EEEii({{.*}}) [[EXPLICIT_ATTR]] 62*67e74705SXin Li b1.implicitTplFunction<1>(7); 63*67e74705SXin Li // CHECK: @_ZN1B19implicitTplFunctionILi2EEEii({{.*}}) [[IMPLICIT_ATTR]] 64*67e74705SXin Li b1.implicitTplFunction<2>(8); 65*67e74705SXin Li b1.explicitTplFunction<0>(9); 66*67e74705SXin Li // CHECK: @_ZN1B19explicitTplFunctionILi1EEEii({{.*}}) [[EXPLICIT_ATTR]] 67*67e74705SXin Li b1.explicitTplFunction<1>(10); 68*67e74705SXin Li // CHECK: @_ZN1B19explicitTplFunctionILi2EEEii({{.*}}) [[EXPLICIT_ATTR]] 69*67e74705SXin Li b1.explicitTplFunction<2>(11); 70*67e74705SXin Li b1.noHintTplFunction<0>(12); 71*67e74705SXin Li // CHECK: @_ZN1B17noHintTplFunctionILi1EEEii({{.*}}) [[EXPLICIT_ATTR]] 72*67e74705SXin Li b1.noHintTplFunction<1>(13); 73*67e74705SXin Li // CHECK: @_ZN1B17noHintTplFunctionILi2EEEii({{.*}}) [[NOHINT_ATTR]] 74*67e74705SXin Li b1.noHintTplFunction<2>(14); 75*67e74705SXin Li // CHECK: @_ZN1B25explicitRedeclTplFunctionILi2EEEii({{.*}}) [[EXPLICIT_ATTR]] 76*67e74705SXin Li b1.explicitRedeclTplFunction<2>(15); 77*67e74705SXin Li // CHECK: @_ZN1BD2Ev({{.*}}) unnamed_addr [[IMPLICIT_CONSTR_ATTR]] 78*67e74705SXin Li } 79*67e74705SXin Li 80*67e74705SXin Li // SUITABLE-NOT: attributes [[NOHINT_ATTR]] = { {{.*}}noinline{{.*}} } 81*67e74705SXin Li // HINTED-DAG: attributes [[NOHINT_ATTR]] = { noinline{{.*}} } 82*67e74705SXin Li // NOINLINE-DAG: attributes [[NOHINT_ATTR]] = { noinline{{.*}} } 83*67e74705SXin Li 84*67e74705SXin Li // SUITABLE-NOT: attributes [[IMPLICIT_ATTR]] = { {{.*}}noinline{{.*}} } 85*67e74705SXin Li // HINTED-NOT: attributes [[IMPLICIT_ATTR]] = { {{.*}}noinline{{.*}} } 86*67e74705SXin Li // NOINLINE-DAG: attributes [[IMPLICIT_ATTR]] = { noinline{{.*}} } 87*67e74705SXin Li 88*67e74705SXin Li // SUITABLE-NOT: attributes [[IMPLICIT_CONSTR_ATTR]] = { {{.*}}noinline{{.*}} } 89*67e74705SXin Li // HINTED-NOT: attributes [[IMPLICIT_ATTR]] = { {{.*}}noinline{{.*}} } 90*67e74705SXin Li // NOINLINE-DAG: attributes [[IMPLICIT_CONSTR_ATTR]] = { noinline{{.*}} } 91*67e74705SXin Li 92*67e74705SXin Li // SUITABLE-NOT: attributes [[EXPLICIT_ATTR]] = { {{.*}}noinline{{.*}} } 93*67e74705SXin Li // HINTED-NOT: attributes [[IMPLICIT_ATTR]] = { {{.*}}noinline{{.*}} } 94*67e74705SXin Li // NOINLINE-DAG: attributes [[EXPLICIT_ATTR]] = { noinline{{.*}} } 95*67e74705SXin Li 96*67e74705SXin Li // CHECK-DAG: attributes [[OPTNONE_ATTR]] = { noinline{{.*}} } 97