predefined-expr.cpp revision 3a1ce1ed0f5686384e712837bad28c576622e442
1// RUN: clang-cc %s -emit-llvm -o - | FileCheck %s
2
3// CHECK: private constant [15 x i8] c"externFunction\00"
4// CHECK: private constant [26 x i8] c"void NS::externFunction()\00"
5
6// CHECK: private constant [22 x i8] c"classTemplateFunction\00"
7// CHECK: private constant [60 x i8] c"void NS::ClassTemplate<NS::Base *>::classTemplateFunction()\00"
8// CHECK: private constant [53 x i8] c"void NS::ClassTemplate<int>::classTemplateFunction()\00"
9
10// CHECK: private constant [18 x i8] c"functionTemplate1\00"
11// CHECK: private constant [45 x i8] c"void NS::Base::functionTemplate1(NS::Base *)\00"
12// CHECK: private constant [38 x i8] c"void NS::Base::functionTemplate1(int)\00"
13
14// CHECK: private constant [12 x i8] c"~Destructor\00"
15// CHECK: private constant [30 x i8] c"NS::Destructor::~Destructor()\00"
16
17// CHECK: private constant [12 x i8] c"Constructor\00"
18// CHECK: private constant [41 x i8] c"NS::Constructor::Constructor(NS::Base *)\00"
19// CHECK: private constant [34 x i8] c"NS::Constructor::Constructor(int)\00"
20// CHECK: private constant [31 x i8] c"NS::Constructor::Constructor()\00"
21
22// CHECK: private constant [16 x i8] c"virtualFunction\00"
23// CHECK: private constant [44 x i8] c"virtual void NS::Derived::virtualFunction()\00"
24
25// CHECK: private constant [26 x i8] c"functionReturingTemplate2\00"
26// CHECK: private constant [64 x i8] c"ClassTemplate<NS::Base *> NS::Base::functionReturingTemplate2()\00"
27
28// CHECK: private constant [26 x i8] c"functionReturingTemplate1\00"
29// CHECK: private constant [57 x i8] c"ClassTemplate<int> NS::Base::functionReturingTemplate1()\00"
30
31// CHECK: private constant [23 x i8] c"withTemplateParameter2\00"
32// CHECK: private constant [65 x i8] c"void NS::Base::withTemplateParameter2(ClassTemplate<NS::Base *>)\00"
33
34// CHECK: private constant [23 x i8] c"withTemplateParameter1\00"
35// CHECK: private constant [58 x i8] c"void NS::Base::withTemplateParameter1(ClassTemplate<int>)\00"
36
37// CHECK: private constant [23 x i8] c"functionReturningClass\00"
38// CHECK: private constant [45 x i8] c"NS::Base *NS::Base::functionReturningClass()\00"
39
40// CHECK: private constant [23 x i8] c"functionWithParameters\00"
41// CHECK: private constant [64 x i8] c"void NS::Base::functionWithParameters(int, float *, NS::Base *)\00"
42
43// CHECK: private constant [17 x i8] c"variadicFunction\00"
44// CHECK: private constant [42 x i8] c"void NS::Base::variadicFunction(int, ...)\00"
45
46// CHECK: private constant [41 x i8] c"virtual void NS::Base::virtualFunction()\00"
47
48// CHECK: private constant [15 x i8] c"inlineFunction\00"
49// CHECK: private constant [32 x i8] c"void NS::Base::inlineFunction()\00"
50
51// CHECK: private constant [11 x i8] c"staticFunc\00"
52// CHECK: private constant [28 x i8] c"void NS::Base::staticFunc()\00"
53
54int printf(const char * _Format, ...);
55
56namespace NS {
57
58template<typename T>
59class ClassTemplate {
60public:
61  void classTemplateFunction() {
62    printf("__func__ %s\n", __func__);
63    printf("__FUNCTION__ %s\n", __FUNCTION__);
64    printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
65  }
66};
67
68class Base {
69public:
70  static void staticFunc() {
71    printf("__func__ %s\n", __func__);
72    printf("__FUNCTION__ %s\n", __FUNCTION__);
73    printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
74  }
75
76  inline void inlineFunction() {
77    printf("__func__ %s\n", __func__);
78    printf("__FUNCTION__ %s\n", __FUNCTION__);
79    printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
80  }
81
82  virtual void virtualFunction() {
83    printf("__func__ %s\n", __func__);
84    printf("__FUNCTION__ %s\n", __FUNCTION__);
85    printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
86  }
87
88  void functionWithParameters(int, float*, Base* base) {
89    printf("__func__ %s\n", __func__);
90    printf("__FUNCTION__ %s\n", __FUNCTION__);
91    printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
92  }
93
94  Base *functionReturningClass() {
95    printf("__func__ %s\n", __func__);
96    printf("__FUNCTION__ %s\n", __FUNCTION__);
97    printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
98    return 0;
99  }
100
101  void variadicFunction(int, ...) {
102    printf("__func__ %s\n", __func__);
103    printf("__FUNCTION__ %s\n", __FUNCTION__);
104    printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
105  }
106
107  void withTemplateParameter1(ClassTemplate<int>) {
108    printf("__func__ %s\n", __func__);
109    printf("__FUNCTION__ %s\n", __FUNCTION__);
110    printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
111  }
112
113  void withTemplateParameter2(ClassTemplate<Base *>) {
114    printf("__func__ %s\n", __func__);
115    printf("__FUNCTION__ %s\n", __FUNCTION__);
116    printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
117  }
118
119  ClassTemplate<int> functionReturingTemplate1() {
120    printf("__func__ %s\n", __func__);
121    printf("__FUNCTION__ %s\n", __FUNCTION__);
122    printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
123    return ClassTemplate<int>();
124  }
125
126  ClassTemplate<Base *> functionReturingTemplate2() {
127    printf("__func__ %s\n", __func__);
128    printf("__FUNCTION__ %s\n", __FUNCTION__);
129    printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
130    return ClassTemplate<Base *>();
131  }
132
133  template<typename T>
134  void functionTemplate1(T t) {
135    printf("__func__ %s\n", __func__);
136    printf("__FUNCTION__ %s\n", __FUNCTION__);
137    printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
138  }
139};
140
141class Derived : public Base {
142public:
143  // Virtual function without being explicitally written.
144  void virtualFunction() {
145    printf("__func__ %s\n", __func__);
146    printf("__FUNCTION__ %s\n", __FUNCTION__);
147    printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
148  }
149};
150
151class Constructor {
152public:
153  Constructor() {
154    printf("__func__ %s\n", __func__);
155    printf("__FUNCTION__ %s\n", __FUNCTION__);
156    printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
157  }
158
159  Constructor(int) {
160    printf("__func__ %s\n", __func__);
161    printf("__FUNCTION__ %s\n", __FUNCTION__);
162    printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
163  }
164
165  Constructor(Base *) {
166    printf("__func__ %s\n", __func__);
167    printf("__FUNCTION__ %s\n", __FUNCTION__);
168    printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
169  }
170
171};
172
173class Destructor {
174public:
175  ~Destructor() {
176    printf("__func__ %s\n", __func__);
177    printf("__FUNCTION__ %s\n", __FUNCTION__);
178    printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
179  }
180};
181
182extern void externFunction() {
183  printf("__func__ %s\n", __func__);
184  printf("__FUNCTION__ %s\n", __FUNCTION__);
185  printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__);
186}
187
188}
189
190int main() {
191  NS::Base::staticFunc();
192
193  NS::Base b;
194  b.inlineFunction();
195  b.virtualFunction();
196  b.variadicFunction(0);
197  b.functionWithParameters(0, 0, 0);
198  b.functionReturningClass();
199
200  b.withTemplateParameter1(NS::ClassTemplate<int>());
201  b.withTemplateParameter2(NS::ClassTemplate<NS::Base *>());
202  b.functionReturingTemplate1();
203  b.functionReturingTemplate2();
204  b.functionTemplate1<int>(0);
205  b.functionTemplate1<NS::Base *>(0);
206
207  NS::Derived d;
208  d.virtualFunction();
209
210  NS::ClassTemplate<int> t1;
211  t1.classTemplateFunction();
212  NS::ClassTemplate<NS::Base *> t2;
213  t2.classTemplateFunction();
214
215  NS::Constructor c1;
216  NS::Constructor c2(0);
217  NS::Constructor c3((NS::Base *)0);
218
219  {
220    NS::Destructor destructor;
221  }
222
223  NS::externFunction();
224
225  return 0;
226}
227