blob: c52b6b4b7a2a7400d55b775ac052392e0661c981 [file] [log] [blame]
Reid Klecknerd6a08d12013-05-14 20:30:42 +00001// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s
2// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=x86_64-pc-win32 | FileCheck -check-prefix X64 %s
Charles Davis9fd23592012-05-26 23:12:19 +00003
4template<typename T>
5class Class {
6 public:
Peter Collingbourneb70d1c32013-04-25 04:25:40 +00007 Class() {}
Charles Davis9fd23592012-05-26 23:12:19 +00008};
9
10class Typename { };
11
12template<typename T>
13class Nested { };
14
15template<bool flag>
16class BoolTemplate {
17 public:
18 BoolTemplate() {}
19};
20
Charles Davisfb527dc2012-05-28 00:43:56 +000021template<int param>
22class IntTemplate {
23 public:
24 IntTemplate() {}
25};
26
Charles Davis3facb622012-06-23 00:27:49 +000027template<>
28class BoolTemplate<true> {
29 public:
30 BoolTemplate() {}
31 template<class T> void Foo(T arg) {}
32};
33
Charles Davis9fd23592012-05-26 23:12:19 +000034void template_mangling() {
35 Class<Typename> c1;
Peter Collingbourneb70d1c32013-04-25 04:25:40 +000036// CHECK: call {{.*}} @"\01??0?$Class@VTypename@@@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000037// X64: call {{.*}} @"\01??0?$Class@VTypename@@@@QEAA@XZ"
Charles Davis9fd23592012-05-26 23:12:19 +000038
Reid Klecknercb5949d2013-04-09 12:47:38 +000039 Class<const Typename> c1_const;
Peter Collingbourneb70d1c32013-04-25 04:25:40 +000040// CHECK: call {{.*}} @"\01??0?$Class@$$CBVTypename@@@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000041// X64: call {{.*}} @"\01??0?$Class@$$CBVTypename@@@@QEAA@XZ"
Reid Klecknercb5949d2013-04-09 12:47:38 +000042 Class<volatile Typename> c1_volatile;
Peter Collingbourneb70d1c32013-04-25 04:25:40 +000043// CHECK: call {{.*}} @"\01??0?$Class@$$CCVTypename@@@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000044// X64: call {{.*}} @"\01??0?$Class@$$CCVTypename@@@@QEAA@XZ"
Reid Klecknercb5949d2013-04-09 12:47:38 +000045 Class<const volatile Typename> c1_cv;
Peter Collingbourneb70d1c32013-04-25 04:25:40 +000046// CHECK: call {{.*}} @"\01??0?$Class@$$CDVTypename@@@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000047// X64: call {{.*}} @"\01??0?$Class@$$CDVTypename@@@@QEAA@XZ"
Reid Klecknercb5949d2013-04-09 12:47:38 +000048
Charles Davis9fd23592012-05-26 23:12:19 +000049 Class<Nested<Typename> > c2;
Peter Collingbourneb70d1c32013-04-25 04:25:40 +000050// CHECK: call {{.*}} @"\01??0?$Class@V?$Nested@VTypename@@@@@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000051// X64: call {{.*}} @"\01??0?$Class@V?$Nested@VTypename@@@@@@QEAA@XZ"
Peter Collingbourneb70d1c32013-04-25 04:25:40 +000052
53 Class<int * const> c_intpc;
54// CHECK: call {{.*}} @"\01??0?$Class@QAH@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000055// X64: call {{.*}} @"\01??0?$Class@QEAH@@QEAA@XZ"
Peter Collingbourneb70d1c32013-04-25 04:25:40 +000056 Class<int()> c_ft;
57// CHECK: call {{.*}} @"\01??0?$Class@$$A6AHXZ@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000058// X64: call {{.*}} @"\01??0?$Class@$$A6AHXZ@@QEAA@XZ"
Peter Collingbourneb70d1c32013-04-25 04:25:40 +000059 Class<int[]> c_inti;
60// CHECK: call {{.*}} @"\01??0?$Class@$$BY0A@H@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000061// X64: call {{.*}} @"\01??0?$Class@$$BY0A@H@@QEAA@XZ"
Peter Collingbourneb70d1c32013-04-25 04:25:40 +000062 Class<int[5]> c_int5;
63// CHECK: call {{.*}} @"\01??0?$Class@$$BY04H@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000064// X64: call {{.*}} @"\01??0?$Class@$$BY04H@@QEAA@XZ"
Peter Collingbourneb70d1c32013-04-25 04:25:40 +000065 Class<const int[5]> c_intc5;
66// CHECK: call {{.*}} @"\01??0?$Class@$$BY04$$CBH@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000067// X64: call {{.*}} @"\01??0?$Class@$$BY04$$CBH@@QEAA@XZ"
Peter Collingbourneb70d1c32013-04-25 04:25:40 +000068 Class<int * const[5]> c_intpc5;
69// CHECK: call {{.*}} @"\01??0?$Class@$$BY04QAH@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000070// X64: call {{.*}} @"\01??0?$Class@$$BY04QEAH@@QEAA@XZ"
Charles Davis9fd23592012-05-26 23:12:19 +000071
72 BoolTemplate<false> _false;
73// CHECK: call {{.*}} @"\01??0?$BoolTemplate@$0A@@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000074// X64: call {{.*}} @"\01??0?$BoolTemplate@$0A@@@QEAA@XZ"
Charles Davis9fd23592012-05-26 23:12:19 +000075
76 BoolTemplate<true> _true;
Charles Davis3facb622012-06-23 00:27:49 +000077 // PR13158
78 _true.Foo(1);
Charles Davis9fd23592012-05-26 23:12:19 +000079// CHECK: call {{.*}} @"\01??0?$BoolTemplate@$00@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000080// X64: call {{.*}} @"\01??0?$BoolTemplate@$00@@QEAA@XZ"
Charles Davis3facb622012-06-23 00:27:49 +000081// CHECK: call {{.*}} @"\01??$Foo@H@?$BoolTemplate@$00@@QAEXH@Z"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000082// X64: call {{.*}} @"\01??$Foo@H@?$BoolTemplate@$00@@QEAAXH@Z"
Charles Davisfb527dc2012-05-28 00:43:56 +000083
Nico Webere95b46b2012-11-08 23:38:59 +000084 IntTemplate<0> zero;
85// CHECK: call {{.*}} @"\01??0?$IntTemplate@$0A@@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000086// X64: call {{.*}} @"\01??0?$IntTemplate@$0A@@@QEAA@XZ"
Nico Webere95b46b2012-11-08 23:38:59 +000087
Charles Davisc1fd52b2012-05-28 16:53:33 +000088 IntTemplate<5> five;
89// CHECK: call {{.*}} @"\01??0?$IntTemplate@$04@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000090// X64: call {{.*}} @"\01??0?$IntTemplate@$04@@QEAA@XZ"
Charles Davisc1fd52b2012-05-28 16:53:33 +000091
Charles Davisfb527dc2012-05-28 00:43:56 +000092 IntTemplate<11> eleven;
93// CHECK: call {{.*}} @"\01??0?$IntTemplate@$0L@@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000094// X64: call {{.*}} @"\01??0?$IntTemplate@$0L@@@QEAA@XZ"
Charles Davisfb527dc2012-05-28 00:43:56 +000095
Nico Weber385b91f2012-10-03 13:39:49 +000096 IntTemplate<256> _256;
97// CHECK: call {{.*}} @"\01??0?$IntTemplate@$0BAA@@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +000098// X64: call {{.*}} @"\01??0?$IntTemplate@$0BAA@@@QEAA@XZ"
Nico Weber385b91f2012-10-03 13:39:49 +000099
100 IntTemplate<513> _513;
101// CHECK: call {{.*}} @"\01??0?$IntTemplate@$0CAB@@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +0000102// X64: call {{.*}} @"\01??0?$IntTemplate@$0CAB@@@QEAA@XZ"
Nico Weber385b91f2012-10-03 13:39:49 +0000103
104 IntTemplate<1026> _1026;
105// CHECK: call {{.*}} @"\01??0?$IntTemplate@$0EAC@@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +0000106// X64: call {{.*}} @"\01??0?$IntTemplate@$0EAC@@@QEAA@XZ"
Nico Weber385b91f2012-10-03 13:39:49 +0000107
Charles Davisfb527dc2012-05-28 00:43:56 +0000108 IntTemplate<65535> ffff;
109// CHECK: call {{.*}} @"\01??0?$IntTemplate@$0PPPP@@@QAE@XZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +0000110// X64: call {{.*}} @"\01??0?$IntTemplate@$0PPPP@@@QEAA@XZ"
Charles Davis9fd23592012-05-26 23:12:19 +0000111}
112
113namespace space {
114 template<class T> const T& foo(const T& l) { return l; }
115}
116// CHECK: "\01??$foo@H@space@@YAABHABH@Z"
Reid Klecknerd6a08d12013-05-14 20:30:42 +0000117// X64: "\01??$foo@H@space@@YAAEBHAEBH@Z"
Charles Davis9fd23592012-05-26 23:12:19 +0000118
119void use() {
120 space::foo(42);
121}
Reid Klecknerff430f62013-03-20 22:29:42 +0000122
123// PR13455
124typedef void (*FunctionPointer)(void);
125
126template <FunctionPointer function>
127void FunctionPointerTemplate() {
128 function();
129}
130
131void spam() {
132 FunctionPointerTemplate<spam>();
133// CHECK: "\01??$FunctionPointerTemplate@$1?spam@@YAXXZ@@YAXXZ"
Reid Klecknerd6a08d12013-05-14 20:30:42 +0000134// X64: "\01??$FunctionPointerTemplate@$1?spam@@YAXXZ@@YAXXZ"
Reid Klecknerff430f62013-03-20 22:29:42 +0000135}