blob: 6639775986d04d2de6b41e292064319aff78366e [file] [log] [blame]
Axel Naumann63469422c2012-10-02 09:09:43 +00001// RUN: rm -rf %t
Richard Smith47972af2015-06-16 00:08:24 +00002// 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// 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
Andy Gibbsc6e68da2012-10-19 12:44:48 +00004// expected-no-diagnostics
Adrian Prantlbc068582015-07-08 01:00:30 +00005// REQUIRES: x86-registered-target
Douglas Gregorc50d4922012-12-11 22:11:52 +00006@import templates_left;
Richard Smith195d8ef2014-05-29 03:15:31 +00007
8void testInlineRedeclEarly() {
9 // instantiate definition now, we'll add another declaration in _right.
10 OutOfLineInline<int>().h();
11}
12
Douglas Gregorc50d4922012-12-11 22:11:52 +000013@import templates_right;
Axel Naumann63469422c2012-10-02 09:09:43 +000014
Richard Smithdc1f0422016-07-20 19:10:16 +000015// CHECK-DAG: @list_left = global %[[LIST:.*]] { %[[LISTNODE:.*]]* null, i32 8 }, align 8
16// CHECK-DAG: @list_right = global %[[LIST]] { %[[LISTNODE]]* null, i32 12 }, align 8
JF Bastien3a881e62018-11-15 00:19:18 +000017// CHECK-DAG: @__const._Z15testMixedStructv.l = {{.*}} constant %[[LIST]] { %{{.*}}* null, i32 1 }, align 8
18// CHECK-DAG: @__const._Z15testMixedStructv.r = {{.*}} constant %[[LIST]] { %{{.*}}* null, i32 2 }, align 8
Richard Smith73b21d82014-09-03 02:33:22 +000019// CHECK-DAG: @_ZN29WithUndefinedStaticDataMemberIA_iE9undefinedE = external global
Axel Naumann63469422c2012-10-02 09:09:43 +000020
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');
Richard Smithcd45dbc2014-04-19 03:48:30 +000030
Richard Smith9c9173d2015-08-11 22:00:24 +000031 static_assert(sizeof(List<long>) == sizeof(List<short>), "");
32
Richard Smithcd45dbc2014-04-19 03:48:30 +000033 List<double> list_double;
34 list_double.push_back(0.0);
Axel Naumann63469422c2012-10-02 09:09:43 +000035}
36
37void testPendingInstantiations() {
Axel Naumannd9a25b32012-10-02 12:18:46 +000038 // CHECK: call {{.*pendingInstantiationEmit}}
39 // CHECK: call {{.*pendingInstantiationEmit}}
40 // CHECK: define {{.*pendingInstantiationEmit.*[(]i}}
41 // CHECK: define {{.*pendingInstantiationEmit.*[(]double}}
Axel Naumann63469422c2012-10-02 09:09:43 +000042 triggerPendingInstantiation();
43 triggerPendingInstantiationToo();
44}
Axel Naumannd9a25b32012-10-02 12:18:46 +000045
46void testRedeclDefinition() {
47 // CHECK: define {{.*redeclDefinitionEmit}}
48 redeclDefinitionEmit();
49}
50
Richard Smith195d8ef2014-05-29 03:15:31 +000051void testInlineRedecl() {
52 outOfLineInlineUseLeftF();
53 outOfLineInlineUseRightG();
54
55 outOfLineInlineUseRightF();
56 outOfLineInlineUseLeftG();
57}
58
Richard Smitheb36ddf2014-04-24 22:45:46 +000059// CHECK-NOT: @_ZN21ExplicitInstantiationILb0ELb0EE1fEv(
60// CHECK: declare {{.*}}@_ZN21ExplicitInstantiationILb1ELb0EE1fEv(
61// CHECK: define {{.*}}@_ZN21ExplicitInstantiationILb1ELb1EE1fEv(
62// CHECK-NOT: @_ZN21ExplicitInstantiationILb0ELb0EE1fEv(
63
Richard Smithd55889a2013-09-09 16:55:27 +000064// These three are all the same type.
65typedef OuterIntInner_left OuterIntInner;
66typedef OuterIntInner_right OuterIntInner;
67typedef Outer<int>::Inner OuterIntInner;
68
Axel Naumannd9a25b32012-10-02 12:18:46 +000069// CHECK: call {{.*pendingInstantiation}}
70// CHECK: call {{.*redeclDefinitionEmit}}
Richard Smith0b87e072013-10-07 08:02:11 +000071
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 8
78 // CHECK: %[[r:.*]] = alloca %[[ListInt]], align 8
79
JF Bastien3a881e62018-11-15 00:19:18 +000080 // CHECK: call {{.*}}memcpy{{.*}}(i8* align {{[0-9]+}} %{{.*}}, i8* align {{[0-9]+}} bitcast ({{.*}}* @__const._Z15testMixedStructv.l to i8*), i64 16,
Richard Smith0b87e072013-10-07 08:02:11 +000081 ListInt_left l{0, 1};
82
JF Bastien3a881e62018-11-15 00:19:18 +000083 // CHECK: call {{.*}}memcpy{{.*}}(i8* align {{[0-9]+}} %{{.*}}, i8* align {{[0-9]+}} bitcast ({{.*}}* @__const._Z15testMixedStructv.r to i8*), i64 16,
Richard Smith0b87e072013-10-07 08:02:11 +000084 ListInt_right r{0, 2};
85
Hal Finkela2347ba2014-07-18 15:52:10 +000086 // CHECK: call void @_Z10useListIntR4ListIiE(%[[ListInt]]* dereferenceable({{[0-9]+}}) %[[l]])
Richard Smith0b87e072013-10-07 08:02:11 +000087 useListInt(l);
Hal Finkela2347ba2014-07-18 15:52:10 +000088 // CHECK: call void @_Z10useListIntR4ListIiE(%[[ListInt]]* dereferenceable({{[0-9]+}}) %[[r]])
Richard Smith0b87e072013-10-07 08:02:11 +000089 useListInt(r);
90
David Blaikiebdf40a62015-03-13 18:21:46 +000091 // CHECK: load i32, i32* bitcast (i8* getelementptr inbounds (i8, i8* bitcast ({{.*}}* @list_left to i8*), i64 8) to i32*)
92 // CHECK: load i32, i32* bitcast (i8* getelementptr inbounds (i8, i8* bitcast ({{.*}}* @list_right to i8*), i64 8) to i32*)
Richard Smith0b87e072013-10-07 08:02:11 +000093 return list_left.*size_right + list_right.*size_left;
94}
Richard Smithf17fdbd2014-04-24 02:25:27 +000095
96template<typename T> struct MergePatternDecl {
97 typedef int Type;
98 void f(Type);
99};
100template<typename T> void MergePatternDecl<T>::f(Type type) {}
Richard Smitheb36ddf2014-04-24 22:45:46 +0000101// CHECK: define {{.*}}@_ZN21ExplicitInstantiationILb0ELb1EE1fEv(
102template struct ExplicitInstantiation<false, true>;
103template struct ExplicitInstantiation<true, true>;
Richard Smithd1c46742014-04-30 02:24:17 +0000104
105void testDelayUpdatesImpl() { testDelayUpdates<int>(); }
Richard Smith73b21d82014-09-03 02:33:22 +0000106
107void testStaticDataMember() {
108 WithUndefinedStaticDataMember<int[]> load_it;
109
110 // CHECK-LABEL: define linkonce_odr i32* @_Z23getStaticDataMemberLeftv(
David Blaikiebdf40a62015-03-13 18:21:46 +0000111 // CHECK: ret i32* getelementptr inbounds ([0 x i32], [0 x i32]* @_ZN29WithUndefinedStaticDataMemberIA_iE9undefinedE, i32 0, i32 0)
Richard Smith73b21d82014-09-03 02:33:22 +0000112 (void) getStaticDataMemberLeft();
113
114 // CHECK-LABEL: define linkonce_odr i32* @_Z24getStaticDataMemberRightv(
David Blaikiebdf40a62015-03-13 18:21:46 +0000115 // CHECK: ret i32* getelementptr inbounds ([0 x i32], [0 x i32]* @_ZN29WithUndefinedStaticDataMemberIA_iE9undefinedE, i32 0, i32 0)
Richard Smith73b21d82014-09-03 02:33:22 +0000116 (void) getStaticDataMemberRight();
117}
118
Richard Smith842e46e2016-10-26 02:31:56 +0000119void 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}
Akira Hatanakad791e922018-03-19 17:38:40 +0000125
126// Check that returnNonTrivial doesn't return Class0<S0> directly in registers.
127
128// CHECK: declare void @_Z16returnNonTrivialv(%struct.Class0* sret)
129
130@import template_nontrivial0;
131@import template_nontrivial1;
132
133S1::S1() : a(returnNonTrivial()) {
134}