135 lines · plain
1// RUN: rm -rf %t2// 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-class3// 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 %s4// expected-no-diagnostics5// REQUIRES: x86-registered-target6@import templates_left;7 8void testInlineRedeclEarly() {9 // instantiate definition now, we'll add another declaration in _right.10 OutOfLineInline<int>().h();11}12 13@import templates_right;14 15// CHECK-DAG: @list_left ={{.*}} global %[[LIST:.*]] { ptr null, i32 8 }, align 816// CHECK-DAG: @list_right ={{.*}} global %[[LIST]] { ptr null, i32 12 }, align 817// CHECK-DAG: @__const._Z15testMixedStructv.l = {{.*}} constant %[[LIST]] { ptr null, i32 1 }, align 818// CHECK-DAG: @__const._Z15testMixedStructv.r = {{.*}} constant %[[LIST]] { ptr null, i32 2 }, align 819// CHECK-DAG: @_ZN29WithUndefinedStaticDataMemberIA_iE9undefinedE = external global20 21void testTemplateClasses() {22 Vector<int> vec_int;23 vec_int.push_back(0);24 25 List<bool> list_bool;26 list_bool.push_back(false);27 28 N::Set<char> set_char;29 set_char.insert('A');30 31 static_assert(sizeof(List<long>) == sizeof(List<short>), "");32 33 List<double> list_double;34 list_double.push_back(0.0);35}36 37void testPendingInstantiations() {38 // CHECK: call {{.*pendingInstantiationEmit}}39 // CHECK: call {{.*pendingInstantiationEmit}}40 // CHECK: define {{.*pendingInstantiationEmit.*[(]i}}41 // CHECK: define {{.*pendingInstantiationEmit.*[(]double}}42 triggerPendingInstantiation();43 triggerPendingInstantiationToo();44}45 46void testRedeclDefinition() {47 // CHECK: define {{.*redeclDefinitionEmit}}48 redeclDefinitionEmit();49}50 51void testInlineRedecl() {52 outOfLineInlineUseLeftF();53 outOfLineInlineUseRightG();54 55 outOfLineInlineUseRightF();56 outOfLineInlineUseLeftG();57}58 59// CHECK-NOT: @_ZN21ExplicitInstantiationILb0ELb0EE1fEv(60// CHECK: declare {{.*}}@_ZN21ExplicitInstantiationILb1ELb0EE1fEv(61// CHECK: define {{.*}}@_ZN21ExplicitInstantiationILb1ELb1EE1fEv(62// CHECK-NOT: @_ZN21ExplicitInstantiationILb0ELb0EE1fEv(63 64// These three are all the same type.65typedef OuterIntInner_left OuterIntInner;66typedef OuterIntInner_right OuterIntInner;67typedef Outer<int>::Inner OuterIntInner;68 69// CHECK: call {{.*pendingInstantiation}}70// CHECK: call {{.*redeclDefinitionEmit}}71 72static_assert(size_left == size_right, "same field both ways");73void useListInt(List<int> &);74 75// CHECK-LABEL: define{{.*}} i32 @_Z15testMixedStructv(76unsigned testMixedStruct() {77 // CHECK: %[[l:.*]] = alloca %[[ListInt:[^ ]*]], align 878 // CHECK: %[[r:.*]] = alloca %[[ListInt]], align 879 80 // CHECK: call {{.*}}memcpy{{.*}}(ptr align {{[0-9]+}} %{{.*}}, ptr align {{[0-9]+}} @__const._Z15testMixedStructv.l, i64 16,81 ListInt_left l{0, 1};82 83 // CHECK: call {{.*}}memcpy{{.*}}(ptr align {{[0-9]+}} %{{.*}}, ptr align {{[0-9]+}} @__const._Z15testMixedStructv.r, i64 16,84 ListInt_right r{0, 2};85 86 // CHECK: call void @_Z10useListIntR4ListIiE(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %[[l]])87 useListInt(l);88 // CHECK: call void @_Z10useListIntR4ListIiE(ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %[[r]])89 useListInt(r);90 91 // CHECK: load i32, ptr getelementptr inbounds (i8, ptr @list_left, i64 8)92 // CHECK: load i32, ptr getelementptr inbounds (i8, ptr @list_right, i64 8)93 return list_left.*size_right + list_right.*size_left;94}95 96template<typename T> struct MergePatternDecl {97 typedef int Type;98 void f(Type);99};100template<typename T> void MergePatternDecl<T>::f(Type type) {}101// CHECK: define {{.*}}@_ZN21ExplicitInstantiationILb0ELb1EE1fEv(102template struct ExplicitInstantiation<false, true>;103template struct ExplicitInstantiation<true, true>;104 105void testDelayUpdatesImpl() { testDelayUpdates<int>(); }106 107void testStaticDataMember() {108 WithUndefinedStaticDataMember<int[]> load_it;109 110 // CHECK-LABEL: define linkonce_odr noundef ptr @_Z23getStaticDataMemberLeftv(111 // CHECK: ret ptr @_ZN29WithUndefinedStaticDataMemberIA_iE9undefinedE112 (void) getStaticDataMemberLeft();113 114 // CHECK-LABEL: define linkonce_odr noundef ptr @_Z24getStaticDataMemberRightv(115 // CHECK: ret ptr @_ZN29WithUndefinedStaticDataMemberIA_iE9undefinedE116 (void) getStaticDataMemberRight();117}118 119void testWithAttributes() {120 auto a = make_with_attributes_left();121 auto b = make_with_attributes_right();122 static_assert(alignof(decltype(a)) == 2, "");123 static_assert(alignof(decltype(b)) == 2, "");124}125 126// Check that returnNonTrivial doesn't return Class0<S0> directly in registers.127 128// CHECK: declare void @_Z16returnNonTrivialv(ptr dead_on_unwind writable sret(%struct.Class0) align 8)129 130@import template_nontrivial0;131@import template_nontrivial1;132 133S1::S1() : a(returnNonTrivial()) {134}135