xref: /aosp_15_r20/external/clang/test/Modules/templates.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
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