1*67e74705SXin Li// RUN: rm -rf %t 2*67e74705SXin Li// RUN: %clang_cc1 -triple x86_64-linux-gnu -std=c++11 -x objective-c++ -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -I %S/Inputs -verify %s -Wno-objc-root-class 3*67e74705SXin Li// RUN: %clang_cc1 -triple x86_64-linux-gnu -std=c++11 -x objective-c++ -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -I %S/Inputs -emit-llvm %s -o - -Wno-objc-root-class | FileCheck %s 4*67e74705SXin Li// expected-no-diagnostics 5*67e74705SXin Li// REQUIRES: x86-registered-target 6*67e74705SXin Li@import templates_left; 7*67e74705SXin Li 8*67e74705SXin Livoid testInlineRedeclEarly() { 9*67e74705SXin Li // instantiate definition now, we'll add another declaration in _right. 10*67e74705SXin Li OutOfLineInline<int>().h(); 11*67e74705SXin Li} 12*67e74705SXin Li 13*67e74705SXin Li@import templates_right; 14*67e74705SXin Li 15*67e74705SXin Li// CHECK-DAG: @list_left = global %class.List { %"struct.List<int>::node"* null, i32 8 }, align 8 16*67e74705SXin Li// CHECK-DAG: @list_right = global %class.List { %"struct.List<int>::node"* null, i32 12 }, align 8 17*67e74705SXin Li// CHECK-DAG: @_ZZ15testMixedStructvE1l = {{.*}} constant %class.List { %{{.*}}* null, i32 1 }, align 8 18*67e74705SXin Li// CHECK-DAG: @_ZZ15testMixedStructvE1r = {{.*}} constant %class.List { %{{.*}}* null, i32 2 }, align 8 19*67e74705SXin Li// CHECK-DAG: @_ZN29WithUndefinedStaticDataMemberIA_iE9undefinedE = external global 20*67e74705SXin Li 21*67e74705SXin Livoid testTemplateClasses() { 22*67e74705SXin Li Vector<int> vec_int; 23*67e74705SXin Li vec_int.push_back(0); 24*67e74705SXin Li 25*67e74705SXin Li List<bool> list_bool; 26*67e74705SXin Li list_bool.push_back(false); 27*67e74705SXin Li 28*67e74705SXin Li N::Set<char> set_char; 29*67e74705SXin Li set_char.insert('A'); 30*67e74705SXin Li 31*67e74705SXin Li static_assert(sizeof(List<long>) == sizeof(List<short>), ""); 32*67e74705SXin Li 33*67e74705SXin Li List<double> list_double; 34*67e74705SXin Li list_double.push_back(0.0); 35*67e74705SXin Li} 36*67e74705SXin Li 37*67e74705SXin Livoid testPendingInstantiations() { 38*67e74705SXin Li // CHECK: call {{.*pendingInstantiationEmit}} 39*67e74705SXin Li // CHECK: call {{.*pendingInstantiationEmit}} 40*67e74705SXin Li // CHECK: define {{.*pendingInstantiationEmit.*[(]i}} 41*67e74705SXin Li // CHECK: define {{.*pendingInstantiationEmit.*[(]double}} 42*67e74705SXin Li triggerPendingInstantiation(); 43*67e74705SXin Li triggerPendingInstantiationToo(); 44*67e74705SXin Li} 45*67e74705SXin Li 46*67e74705SXin Livoid testRedeclDefinition() { 47*67e74705SXin Li // CHECK: define {{.*redeclDefinitionEmit}} 48*67e74705SXin Li redeclDefinitionEmit(); 49*67e74705SXin Li} 50*67e74705SXin Li 51*67e74705SXin Livoid testInlineRedecl() { 52*67e74705SXin Li outOfLineInlineUseLeftF(); 53*67e74705SXin Li outOfLineInlineUseRightG(); 54*67e74705SXin Li 55*67e74705SXin Li outOfLineInlineUseRightF(); 56*67e74705SXin Li outOfLineInlineUseLeftG(); 57*67e74705SXin Li} 58*67e74705SXin Li 59*67e74705SXin Li// CHECK-NOT: @_ZN21ExplicitInstantiationILb0ELb0EE1fEv( 60*67e74705SXin Li// CHECK: declare {{.*}}@_ZN21ExplicitInstantiationILb1ELb0EE1fEv( 61*67e74705SXin Li// CHECK: define {{.*}}@_ZN21ExplicitInstantiationILb1ELb1EE1fEv( 62*67e74705SXin Li// CHECK-NOT: @_ZN21ExplicitInstantiationILb0ELb0EE1fEv( 63*67e74705SXin Li 64*67e74705SXin Li// These three are all the same type. 65*67e74705SXin Litypedef OuterIntInner_left OuterIntInner; 66*67e74705SXin Litypedef OuterIntInner_right OuterIntInner; 67*67e74705SXin Litypedef Outer<int>::Inner OuterIntInner; 68*67e74705SXin Li 69*67e74705SXin Li// CHECK: call {{.*pendingInstantiation}} 70*67e74705SXin Li// CHECK: call {{.*redeclDefinitionEmit}} 71*67e74705SXin Li 72*67e74705SXin Listatic_assert(size_left == size_right, "same field both ways"); 73*67e74705SXin Livoid useListInt(List<int> &); 74*67e74705SXin Li 75*67e74705SXin Li// CHECK-LABEL: define i32 @_Z15testMixedStructv( 76*67e74705SXin Liunsigned testMixedStruct() { 77*67e74705SXin Li // CHECK: %[[l:.*]] = alloca %[[ListInt:[^ ]*]], align 8 78*67e74705SXin Li // CHECK: %[[r:.*]] = alloca %[[ListInt]], align 8 79*67e74705SXin Li 80*67e74705SXin Li // CHECK: call {{.*}}memcpy{{.*}}(i8* %{{.*}}, i8* bitcast ({{.*}}* @_ZZ15testMixedStructvE1l to i8*), i64 16, 81*67e74705SXin Li ListInt_left l{0, 1}; 82*67e74705SXin Li 83*67e74705SXin Li // CHECK: call {{.*}}memcpy{{.*}}(i8* %{{.*}}, i8* bitcast ({{.*}}* @_ZZ15testMixedStructvE1r to i8*), i64 16, 84*67e74705SXin Li ListInt_right r{0, 2}; 85*67e74705SXin Li 86*67e74705SXin Li // CHECK: call void @_Z10useListIntR4ListIiE(%[[ListInt]]* dereferenceable({{[0-9]+}}) %[[l]]) 87*67e74705SXin Li useListInt(l); 88*67e74705SXin Li // CHECK: call void @_Z10useListIntR4ListIiE(%[[ListInt]]* dereferenceable({{[0-9]+}}) %[[r]]) 89*67e74705SXin Li useListInt(r); 90*67e74705SXin Li 91*67e74705SXin Li // CHECK: load i32, i32* bitcast (i8* getelementptr inbounds (i8, i8* bitcast ({{.*}}* @list_left to i8*), i64 8) to i32*) 92*67e74705SXin Li // CHECK: load i32, i32* bitcast (i8* getelementptr inbounds (i8, i8* bitcast ({{.*}}* @list_right to i8*), i64 8) to i32*) 93*67e74705SXin Li return list_left.*size_right + list_right.*size_left; 94*67e74705SXin Li} 95*67e74705SXin Li 96*67e74705SXin Litemplate<typename T> struct MergePatternDecl { 97*67e74705SXin Li typedef int Type; 98*67e74705SXin Li void f(Type); 99*67e74705SXin Li}; 100*67e74705SXin Litemplate<typename T> void MergePatternDecl<T>::f(Type type) {} 101*67e74705SXin Li// CHECK: define {{.*}}@_ZN21ExplicitInstantiationILb0ELb1EE1fEv( 102*67e74705SXin Litemplate struct ExplicitInstantiation<false, true>; 103*67e74705SXin Litemplate struct ExplicitInstantiation<true, true>; 104*67e74705SXin Li 105*67e74705SXin Livoid testDelayUpdatesImpl() { testDelayUpdates<int>(); } 106*67e74705SXin Li 107*67e74705SXin Livoid testStaticDataMember() { 108*67e74705SXin Li WithUndefinedStaticDataMember<int[]> load_it; 109*67e74705SXin Li 110*67e74705SXin Li // CHECK-LABEL: define linkonce_odr i32* @_Z23getStaticDataMemberLeftv( 111*67e74705SXin Li // CHECK: ret i32* getelementptr inbounds ([0 x i32], [0 x i32]* @_ZN29WithUndefinedStaticDataMemberIA_iE9undefinedE, i32 0, i32 0) 112*67e74705SXin Li (void) getStaticDataMemberLeft(); 113*67e74705SXin Li 114*67e74705SXin Li // CHECK-LABEL: define linkonce_odr i32* @_Z24getStaticDataMemberRightv( 115*67e74705SXin Li // CHECK: ret i32* getelementptr inbounds ([0 x i32], [0 x i32]* @_ZN29WithUndefinedStaticDataMemberIA_iE9undefinedE, i32 0, i32 0) 116*67e74705SXin Li (void) getStaticDataMemberRight(); 117*67e74705SXin Li} 118*67e74705SXin Li 119*67e74705SXin Li 120