brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · d7b7d5a Raw
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