1 // RUN: %clang_cc1 -fms-extensions -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s
2 
3 template<typename T>
4 class Class {
5  public:
6   Class() {}
7 };
8 
9 class Typename { };
10 
11 template<typename T>
12 class Nested { };
13 
14 template<bool flag>
15 class BoolTemplate {
16  public:
17   BoolTemplate() {}
18 };
19 
20 template<int param>
21 class IntTemplate {
22  public:
23   IntTemplate() {}
24 };
25 
26 template<>
27 class BoolTemplate<true> {
28  public:
29   BoolTemplate() {}
30   template<class T> void Foo(T arg) {}
31 };
32 
33 void template_mangling() {
34   Class<Typename> c1;
35 // CHECK: call {{.*}} @"\01??0?$Class@VTypename@@@@QAE@XZ"
36 
37   Class<const Typename> c1_const;
38 // CHECK: call {{.*}} @"\01??0?$Class@$$CBVTypename@@@@QAE@XZ"
39   Class<volatile Typename> c1_volatile;
40 // CHECK: call {{.*}} @"\01??0?$Class@$$CCVTypename@@@@QAE@XZ"
41   Class<const volatile Typename> c1_cv;
42 // CHECK: call {{.*}} @"\01??0?$Class@$$CDVTypename@@@@QAE@XZ"
43 
44   Class<Nested<Typename> > c2;
45 // CHECK: call {{.*}} @"\01??0?$Class@V?$Nested@VTypename@@@@@@QAE@XZ"
46 
47   Class<int * const> c_intpc;
48 // CHECK: call {{.*}} @"\01??0?$Class@QAH@@QAE@XZ"
49   Class<int()> c_ft;
50 // CHECK: call {{.*}} @"\01??0?$Class@$$A6AHXZ@@QAE@XZ"
51   Class<int[]> c_inti;
52 // CHECK: call {{.*}} @"\01??0?$Class@$$BY0A@H@@QAE@XZ"
53   Class<int[5]> c_int5;
54 // CHECK: call {{.*}} @"\01??0?$Class@$$BY04H@@QAE@XZ"
55   Class<const int[5]> c_intc5;
56 // CHECK: call {{.*}} @"\01??0?$Class@$$BY04$$CBH@@QAE@XZ"
57   Class<int * const[5]> c_intpc5;
58 // CHECK: call {{.*}} @"\01??0?$Class@$$BY04QAH@@QAE@XZ"
59 
60   BoolTemplate<false> _false;
61 // CHECK: call {{.*}} @"\01??0?$BoolTemplate@$0A@@@QAE@XZ"
62 
63   BoolTemplate<true> _true;
64   // PR13158
65   _true.Foo(1);
66 // CHECK: call {{.*}} @"\01??0?$BoolTemplate@$00@@QAE@XZ"
67 // CHECK: call {{.*}} @"\01??$Foo@H@?$BoolTemplate@$00@@QAEXH@Z"
68 
69   IntTemplate<0> zero;
70 // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0A@@@QAE@XZ"
71 
72   IntTemplate<5> five;
73 // CHECK: call {{.*}} @"\01??0?$IntTemplate@$04@@QAE@XZ"
74 
75   IntTemplate<11> eleven;
76 // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0L@@@QAE@XZ"
77 
78   IntTemplate<256> _256;
79 // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0BAA@@@QAE@XZ"
80 
81   IntTemplate<513> _513;
82 // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0CAB@@@QAE@XZ"
83 
84   IntTemplate<1026> _1026;
85 // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0EAC@@@QAE@XZ"
86 
87   IntTemplate<65535> ffff;
88 // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0PPPP@@@QAE@XZ"
89 }
90 
91 namespace space {
92   template<class T> const T& foo(const T& l) { return l; }
93 }
94 // CHECK: "\01??$foo@H@space@@YAABHABH@Z"
95 
96 void use() {
97   space::foo(42);
98 }
99 
100 // PR13455
101 typedef void (*FunctionPointer)(void);
102 
103 template <FunctionPointer function>
104 void FunctionPointerTemplate() {
105   function();
106 }
107 
108 void spam() {
109   FunctionPointerTemplate<spam>();
110 // CHECK: "\01??$FunctionPointerTemplate@$1?spam@@YAXXZ@@YAXXZ"
111 }
112