SemaTemplateInstantiate.cpp revision 7429654ea581f10ed2ddb400efddad928bd5a051
1//===------- SemaTemplateInstantiate.cpp - C++ Template Instantiation ------===/
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//===----------------------------------------------------------------------===/
8//
9//  This file implements C++ template instantiation.
10//
11//===----------------------------------------------------------------------===/
12
13#include "Sema.h"
14#include "clang/AST/ASTContext.h"
15#include "clang/AST/Expr.h"
16#include "clang/AST/ExprCXX.h"
17#include "clang/AST/DeclTemplate.h"
18#include "clang/Parse/DeclSpec.h"
19#include "clang/Basic/LangOptions.h"
20
21using namespace clang;
22
23//===----------------------------------------------------------------------===/
24// Template Instantiation for Types
25//===----------------------------------------------------------------------===/
26
27static QualType PerformTypeInstantiation(Sema &SemaRef,
28                                         const ExtQualType *T,
29                                         unsigned CVR,
30                                         const TemplateArgument *TemplateArgs,
31                                         unsigned NumTemplateArgs,
32                                         SourceLocation Loc,
33                                         DeclarationName Entity) {
34  // FIXME: Implement this
35  assert(false && "Cannot instantiate ExtQualType yet");
36  return QualType();
37}
38
39static QualType PerformTypeInstantiation(Sema &SemaRef,
40                                         const BuiltinType *T,
41                                         unsigned CVR,
42                                         const TemplateArgument *TemplateArgs,
43                                         unsigned NumTemplateArgs,
44                                         SourceLocation Loc,
45                                         DeclarationName Entity) {
46  assert(false && "BuiltinType is never dependent and cannot be instantiated");
47  return QualType(T, CVR);
48}
49
50static QualType PerformTypeInstantiation(Sema &SemaRef,
51                                         const FixedWidthIntType *T,
52                                         unsigned CVR,
53                                         const TemplateArgument *TemplateArgs,
54                                         unsigned NumTemplateArgs,
55                                         SourceLocation Loc,
56                                         DeclarationName Entity) {
57  // FIXME: Implement this
58  assert(false && "Cannot instantiate FixedWidthIntType yet");
59  return QualType();
60}
61
62static QualType PerformTypeInstantiation(Sema &SemaRef,
63                                         const ComplexType *T,
64                                         unsigned CVR,
65                                         const TemplateArgument *TemplateArgs,
66                                         unsigned NumTemplateArgs,
67                                         SourceLocation Loc,
68                                         DeclarationName Entity) {
69  // FIXME: Implement this
70  assert(false && "Cannot instantiate ComplexType yet");
71  return QualType();
72}
73
74static QualType PerformTypeInstantiation(Sema &SemaRef,
75                                         const PointerType *T,
76                                         unsigned CVR,
77                                         const TemplateArgument *TemplateArgs,
78                                         unsigned NumTemplateArgs,
79                                         SourceLocation Loc,
80                                         DeclarationName Entity) {
81  // FIXME: Implement this
82  assert(false && "Cannot instantiate PointerType yet");
83  return QualType();
84}
85
86static QualType PerformTypeInstantiation(Sema &SemaRef,
87                                         const BlockPointerType *T,
88                                         unsigned CVR,
89                                         const TemplateArgument *TemplateArgs,
90                                         unsigned NumTemplateArgs,
91                                         SourceLocation Loc,
92                                         DeclarationName Entity) {
93  // FIXME: Implement this
94  assert(false && "Cannot instantiate BlockPointerType yet");
95  return QualType();
96}
97
98static QualType PerformTypeInstantiation(Sema &SemaRef,
99                                         const ReferenceType *T,
100                                         unsigned CVR,
101                                         const TemplateArgument *TemplateArgs,
102                                         unsigned NumTemplateArgs,
103                                         SourceLocation Loc,
104                                         DeclarationName Entity) {
105  // FIXME: Implement this
106  assert(false && "Cannot instantiate ReferenceType yet");
107  return QualType();
108}
109
110static QualType PerformTypeInstantiation(Sema &SemaRef,
111                                         const MemberPointerType *T,
112                                         unsigned CVR,
113                                         const TemplateArgument *TemplateArgs,
114                                         unsigned NumTemplateArgs,
115                                         SourceLocation Loc,
116                                         DeclarationName Entity) {
117  // FIXME: Implement this
118  assert(false && "Cannot instantiate MemberPointerType yet");
119  return QualType();
120}
121
122static QualType PerformTypeInstantiation(Sema &SemaRef,
123                                         const ConstantArrayType *T,
124                                         unsigned CVR,
125                                         const TemplateArgument *TemplateArgs,
126                                         unsigned NumTemplateArgs,
127                                         SourceLocation Loc,
128                                         DeclarationName Entity) {
129  // FIXME: Implement this
130  assert(false && "Cannot instantiate ConstantArrayType yet");
131  return QualType();
132}
133
134static QualType PerformTypeInstantiation(Sema &SemaRef,
135                                         const IncompleteArrayType *T,
136                                         unsigned CVR,
137                                         const TemplateArgument *TemplateArgs,
138                                         unsigned NumTemplateArgs,
139                                         SourceLocation Loc,
140                                         DeclarationName Entity) {
141  // FIXME: Implement this
142  assert(false && "Cannot instantiate IncompleteArrayType yet");
143  return QualType();
144}
145
146static QualType PerformTypeInstantiation(Sema &SemaRef,
147                                         const VariableArrayType *T,
148                                         unsigned CVR,
149                                         const TemplateArgument *TemplateArgs,
150                                         unsigned NumTemplateArgs,
151                                         SourceLocation Loc,
152                                         DeclarationName Entity) {
153  // FIXME: Implement this
154  assert(false && "Cannot instantiate VariableArrayType yet");
155  return QualType();
156}
157
158static QualType PerformTypeInstantiation(Sema &SemaRef,
159                                         const DependentSizedArrayType *T,
160                                         unsigned CVR,
161                                         const TemplateArgument *TemplateArgs,
162                                         unsigned NumTemplateArgs,
163                                         SourceLocation Loc,
164                                         DeclarationName Entity) {
165  // FIXME: Implement this
166  assert(false && "Cannot instantiate DependentSizedArrayType yet");
167  return QualType();
168}
169
170static QualType PerformTypeInstantiation(Sema &SemaRef,
171                                         const VectorType *T,
172                                         unsigned CVR,
173                                         const TemplateArgument *TemplateArgs,
174                                         unsigned NumTemplateArgs,
175                                         SourceLocation Loc,
176                                         DeclarationName Entity) {
177  // FIXME: Implement this
178  assert(false && "Cannot instantiate VectorType yet");
179  return QualType();
180}
181
182static QualType PerformTypeInstantiation(Sema &SemaRef,
183                                         const ExtVectorType *T,
184                                         unsigned CVR,
185                                         const TemplateArgument *TemplateArgs,
186                                         unsigned NumTemplateArgs,
187                                         SourceLocation Loc,
188                                         DeclarationName Entity) {
189  // FIXME: Implement this
190  assert(false && "Cannot instantiate ExtVectorType yet");
191  return QualType();
192}
193
194static QualType PerformTypeInstantiation(Sema &SemaRef,
195                                         const FunctionProtoType *T,
196                                         unsigned CVR,
197                                         const TemplateArgument *TemplateArgs,
198                                         unsigned NumTemplateArgs,
199                                         SourceLocation Loc,
200                                         DeclarationName Entity) {
201  // FIXME: Implement this
202  assert(false && "Cannot instantiate FunctionProtoType yet");
203  return QualType();
204}
205
206static QualType PerformTypeInstantiation(Sema &SemaRef,
207                                         const FunctionNoProtoType *T,
208                                         unsigned CVR,
209                                         const TemplateArgument *TemplateArgs,
210                                         unsigned NumTemplateArgs,
211                                         SourceLocation Loc,
212                                         DeclarationName Entity) {
213  // FIXME: Implement this
214  assert(false && "Cannot instantiate FunctionNoProtoType yet");
215  return QualType();
216}
217
218static QualType PerformTypeInstantiation(Sema &SemaRef,
219                                         const TypedefType *T,
220                                         unsigned CVR,
221                                         const TemplateArgument *TemplateArgs,
222                                         unsigned NumTemplateArgs,
223                                         SourceLocation Loc,
224                                         DeclarationName Entity) {
225  // FIXME: Implement this
226  assert(false && "Cannot instantiate TypedefType yet");
227  return QualType();
228}
229
230static QualType PerformTypeInstantiation(Sema &SemaRef,
231                                         const TypeOfExprType *T,
232                                         unsigned CVR,
233                                         const TemplateArgument *TemplateArgs,
234                                         unsigned NumTemplateArgs,
235                                         SourceLocation Loc,
236                                         DeclarationName Entity) {
237  // FIXME: Implement this
238  assert(false && "Cannot instantiate TypeOfExprType yet");
239  return QualType();
240}
241
242static QualType PerformTypeInstantiation(Sema &SemaRef,
243                                         const TypeOfType *T,
244                                         unsigned CVR,
245                                         const TemplateArgument *TemplateArgs,
246                                         unsigned NumTemplateArgs,
247                                         SourceLocation Loc,
248                                         DeclarationName Entity) {
249  // FIXME: Implement this
250  assert(false && "Cannot instantiate TypeOfType yet");
251  return QualType();
252}
253
254static QualType PerformTypeInstantiation(Sema &SemaRef,
255                                         const RecordType *T,
256                                         unsigned CVR,
257                                         const TemplateArgument *TemplateArgs,
258                                         unsigned NumTemplateArgs,
259                                         SourceLocation Loc,
260                                         DeclarationName Entity) {
261  // FIXME: Implement this
262  assert(false && "Cannot instantiate RecordType yet");
263  return QualType();
264}
265
266static QualType PerformTypeInstantiation(Sema &SemaRef,
267                                         const CXXRecordType *T,
268                                         unsigned CVR,
269                                         const TemplateArgument *TemplateArgs,
270                                         unsigned NumTemplateArgs,
271                                         SourceLocation Loc,
272                                         DeclarationName Entity) {
273  // FIXME: Implement this
274  assert(false && "Cannot instantiate CXXRecordType yet");
275  return QualType();
276}
277
278static QualType PerformTypeInstantiation(Sema &SemaRef,
279                                         const EnumType *T,
280                                         unsigned CVR,
281                                         const TemplateArgument *TemplateArgs,
282                                         unsigned NumTemplateArgs,
283                                         SourceLocation Loc,
284                                         DeclarationName Entity) {
285  // FIXME: Implement this
286  assert(false && "Cannot instantiate EnumType yet");
287  return QualType();
288}
289
290static QualType PerformTypeInstantiation(Sema &SemaRef,
291                                         const TemplateTypeParmType *T,
292                                         unsigned CVR,
293                                         const TemplateArgument *TemplateArgs,
294                                         unsigned NumTemplateArgs,
295                                         SourceLocation Loc,
296                                         DeclarationName Entity) {
297  if (T->getDepth() == 0) {
298    // Replace the template type parameter with its corresponding
299    // template argument.
300    assert(T->getIndex() < NumTemplateArgs && "Wrong # of template args");
301    assert(TemplateArgs[T->getIndex()].getKind() == TemplateArgument::Type &&
302           "Template argument kind mismatch");
303    QualType Result = TemplateArgs[T->getIndex()].getAsType();
304    if (Result.isNull() || !CVR)
305      return Result;
306
307    // C++ [dcl.ref]p1:
308    //   [...] Cv-qualified references are ill-formed except when
309    //   the cv-qualifiers are introduced through the use of a
310    //   typedef (7.1.3) or of a template type argument (14.3), in
311    //   which case the cv-qualifiers are ignored.
312    if (CVR && Result->isReferenceType())
313      CVR = 0;
314
315    return QualType(Result.getTypePtr(), CVR | Result.getCVRQualifiers());
316  }
317
318  // The template type parameter comes from an inner template (e.g.,
319  // the template parameter list of a member template inside the
320  // template we are instantiating). Create a new template type
321  // parameter with the template "level" reduced by one.
322  return SemaRef.Context.getTemplateTypeParmType(T->getDepth() - 1,
323                                                 T->getIndex(),
324                                                 T->getName());
325}
326
327static QualType PerformTypeInstantiation(Sema &SemaRef,
328                                     const ClassTemplateSpecializationType *T,
329                                         unsigned CVR,
330                                         const TemplateArgument *TemplateArgs,
331                                         unsigned NumTemplateArgs,
332                                         SourceLocation Loc,
333                                         DeclarationName Entity) {
334  // FIXME: Implement this
335  assert(false && "Cannot instantiate ClassTemplateSpecializationType yet");
336  return QualType();
337}
338
339static QualType PerformTypeInstantiation(Sema &SemaRef,
340                                         const ObjCInterfaceType *T,
341                                         unsigned CVR,
342                                         const TemplateArgument *TemplateArgs,
343                                         unsigned NumTemplateArgs,
344                                         SourceLocation Loc,
345                                         DeclarationName Entity) {
346  // FIXME: Implement this
347  assert(false && "Cannot instantiate ObjCInterfaceType yet");
348  return QualType();
349}
350
351static QualType PerformTypeInstantiation(Sema &SemaRef,
352                                         const ObjCQualifiedInterfaceType *T,
353                                         unsigned CVR,
354                                         const TemplateArgument *TemplateArgs,
355                                         unsigned NumTemplateArgs,
356                                         SourceLocation Loc,
357                                         DeclarationName Entity) {
358  // FIXME: Implement this
359  assert(false && "Cannot instantiate ObjCQualifiedInterfaceType yet");
360  return QualType();
361}
362
363static QualType PerformTypeInstantiation(Sema &SemaRef,
364                                         const ObjCQualifiedIdType *T,
365                                         unsigned CVR,
366                                         const TemplateArgument *TemplateArgs,
367                                         unsigned NumTemplateArgs,
368                                         SourceLocation Loc,
369                                         DeclarationName Entity) {
370  // FIXME: Implement this
371  assert(false && "Cannot instantiate ObjCQualifiedIdType yet");
372  return QualType();
373}
374
375static QualType PerformTypeInstantiation(Sema &SemaRef,
376                                         const ObjCQualifiedClassType *T,
377                                         unsigned CVR,
378                                         const TemplateArgument *TemplateArgs,
379                                         unsigned NumTemplateArgs,
380                                         SourceLocation Loc,
381                                         DeclarationName Entity) {
382  // FIXME: Implement this
383  assert(false && "Cannot instantiate ObjCQualifiedClassType yet");
384  return QualType();
385}
386
387
388/// \brief Instantiate the type T with a given set of template arguments.
389///
390/// This routine substitutes the given template arguments into the
391/// type T and produces the instantiated type.
392///
393/// \param T the type into which the template arguments will be
394/// substituted. If this type is not dependent, it will be returned
395/// immediately.
396///
397/// \param TemplateArgs the template arguments that will be
398/// substituted for the top-level template parameters within T.
399///
400/// \param NumTemplateArgs the number of template arguments provided
401/// by TemplateArgs.
402///
403/// \param Loc the location in the source code where this substitution
404/// is being performed. It will typically be the location of the
405/// declarator (if we're instantiating the type of some declaration)
406/// or the location of the type in the source code (if, e.g., we're
407/// instantiating the type of a cast expression).
408///
409/// \param Entity the name of the entity associated with a declaration
410/// being instantiated (if any). May be empty to indicate that there
411/// is no such entity (if, e.g., this is a type that occurs as part of
412/// a cast expression) or that the entity has no name (e.g., an
413/// unnamed function parameter).
414///
415/// \returns If the instantiation succeeds, the instantiated
416/// type. Otherwise, produces diagnostics and returns a NULL type.
417QualType Sema::InstantiateType(QualType T,
418                               const TemplateArgument *TemplateArgs,
419                               unsigned NumTemplateArgs,
420                               SourceLocation Loc, DeclarationName Entity) {
421  // If T is not a dependent type, there is nothing to do.
422  if (!T->isDependentType())
423    return T;
424
425  switch (T->getTypeClass()) {
426#define TYPE(Class, Base)                                               \
427  case Type::Class:                                                     \
428    return PerformTypeInstantiation(*this,                              \
429                                    cast<Class##Type>(T.getTypePtr()),  \
430                                    T.getCVRQualifiers(), TemplateArgs, \
431                                    NumTemplateArgs, Loc, Entity);
432#define ABSTRACT_TYPE(Class, Base)
433#include "clang/AST/TypeNodes.def"
434  }
435
436  assert(false && "Not all types hav been decided for template instantiation");
437  return QualType();
438}
439