1*67e74705SXin Li // RUN: rm -rf %t 2*67e74705SXin Li // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c++ -std=c++11 -fmodules-cache-path=%t -I %S/Inputs -triple %itanium_abi_triple -disable-llvm-optzns -emit-llvm -o - %s | FileCheck %s 3*67e74705SXin Li // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c++ -std=c++11 -fmodules-cache-path=%t -I %S/Inputs -triple %itanium_abi_triple -disable-llvm-optzns -emit-llvm -debug-info-kind=limited -o - %s | FileCheck %s 4*67e74705SXin Li // FIXME: When we have a syntax for modules in C++, use that. 5*67e74705SXin Li 6*67e74705SXin Li @import cxx_irgen_top; 7*67e74705SXin Li 8*67e74705SXin Li CtorInit<int> x; 9*67e74705SXin Li 10*67e74705SXin Li @import cxx_irgen_left; 11*67e74705SXin Li @import cxx_irgen_right; 12*67e74705SXin Li 13*67e74705SXin Li // Keep these two namespace definitions separate; merging them hides the bug. 14*67e74705SXin Li namespace EmitInlineMethods { 15*67e74705SXin Li // CHECK-DAG: define linkonce_odr [[CC:([0-9_a-z]*cc[ ]+)?]]void @_ZN17EmitInlineMethods1C1fEPNS_1AE( 16*67e74705SXin Li // CHECK-DAG: declare [[CC]]void @_ZN17EmitInlineMethods1A1gEv( 17*67e74705SXin Li struct C { fEmitInlineMethods::C18*67e74705SXin Li __attribute__((used)) void f(A *p) { p->g(); } 19*67e74705SXin Li }; 20*67e74705SXin Li } 21*67e74705SXin Li namespace EmitInlineMethods { 22*67e74705SXin Li // CHECK-DAG: define linkonce_odr [[CC]]void @_ZN17EmitInlineMethods1D1fEPNS_1BE( 23*67e74705SXin Li // CHECK-DAG: define linkonce_odr [[CC]]void @_ZN17EmitInlineMethods1B1gEv( 24*67e74705SXin Li struct D { fEmitInlineMethods::D25*67e74705SXin Li __attribute__((used)) void f(B *p) { p->g(); } 26*67e74705SXin Li }; 27*67e74705SXin Li } 28*67e74705SXin Li 29*67e74705SXin Li // CHECK-DAG: define available_externally hidden {{.*}}{{signext i32|i32}} @_ZN1SIiE1gEv({{.*}} #[[ALWAYS_INLINE:.*]] align 30*67e74705SXin Li int a = S<int>::g(); 31*67e74705SXin Li 32*67e74705SXin Li int b = h(); 33*67e74705SXin Li 34*67e74705SXin Li // CHECK-DAG: define linkonce_odr {{.*}}{{signext i32|i32}} @_Z3minIiET_S0_S0_(i32 35*67e74705SXin Li int c = min(1, 2); 36*67e74705SXin Li // CHECK: define available_externally {{.*}}{{signext i32|i32}} @_ZN1SIiE1fEv({{.*}} #[[ALWAYS_INLINE]] align 37*67e74705SXin Li 38*67e74705SXin Li namespace ImplicitSpecialMembers { 39*67e74705SXin Li // CHECK-LABEL: define {{.*}} @_ZN22ImplicitSpecialMembers1BC2ERKS0_( 40*67e74705SXin Li // CHECK: call {{.*}} @_ZN22ImplicitSpecialMembers1AC1ERKS0_( 41*67e74705SXin Li // CHECK-LABEL: define {{.*}} @_ZN22ImplicitSpecialMembers1BC2EOS0_( 42*67e74705SXin Li // CHECK: call {{.*}} @_ZN22ImplicitSpecialMembers1AC1ERKS0_( 43*67e74705SXin Li // CHECK-LABEL: define {{.*}} @_ZN22ImplicitSpecialMembers1CC2ERKS0_( 44*67e74705SXin Li // CHECK: call {{.*}} @_ZN22ImplicitSpecialMembers1AC1ERKS0_( 45*67e74705SXin Li // CHECK-LABEL: define {{.*}} @_ZN22ImplicitSpecialMembers1CC2EOS0_( 46*67e74705SXin Li // CHECK: call {{.*}} @_ZN22ImplicitSpecialMembers1AC1ERKS0_( 47*67e74705SXin Li // CHECK-LABEL: define {{.*}} @_ZN22ImplicitSpecialMembers1DC2ERKS0_( 48*67e74705SXin Li // CHECK: call {{.*}} @_ZN22ImplicitSpecialMembers1AC1ERKS0_( 49*67e74705SXin Li // CHECK-LABEL: define {{.*}} @_ZN22ImplicitSpecialMembers1DC2EOS0_( 50*67e74705SXin Li // CHECK: call {{.*}} @_ZN22ImplicitSpecialMembers1AC1ERKS0_( 51*67e74705SXin Li // CHECK-LABEL: define {{.*}} @_ZN20OperatorDeleteLookup1AD0Ev( 52*67e74705SXin Li // CHECK: call {{.*}}void @_ZN20OperatorDeleteLookup1AdlEPv( 53*67e74705SXin Li 54*67e74705SXin Li // CHECK-DAG: call {{[a-z\_\d]*[ ]?i32}} @_ZN8CtorInitIiE1fEv( 55*67e74705SXin Li 56*67e74705SXin Li extern B b1; 57*67e74705SXin Li B b2(b1); 58*67e74705SXin Li B b3(static_cast<B&&>(b1)); 59*67e74705SXin Li 60*67e74705SXin Li extern C c1; 61*67e74705SXin Li C c2(c1); 62*67e74705SXin Li C c3(static_cast<C&&>(c1)); 63*67e74705SXin Li 64*67e74705SXin Li extern D d1; 65*67e74705SXin Li D d2(d1); 66*67e74705SXin Li D d3(static_cast<D&&>(d1)); 67*67e74705SXin Li } 68*67e74705SXin Li 69*67e74705SXin Li namespace OperatorDeleteLookup { 70*67e74705SXin Li // Trigger emission of B's vtable and deleting dtor. 71*67e74705SXin Li // This requires us to know what operator delete was selected. g()72*67e74705SXin Li void g() { f(); } 73*67e74705SXin Li } 74*67e74705SXin Li 75*67e74705SXin Li 76*67e74705SXin Li // CHECK: attributes #[[ALWAYS_INLINE]] = {{.*}} alwaysinline 77