]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - contrib/llvm/tools/clang/include/clang/AST/TemplateName.h
Copy head to stable/9 as part of 9.0-RELEASE release cycle.
[FreeBSD/stable/9.git] / contrib / llvm / tools / clang / include / clang / AST / TemplateName.h
1 //===--- TemplateName.h - C++ Template Name Representation-------*- C++ -*-===//
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 //
10 //  This file defines the TemplateName interface and subclasses.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_CLANG_AST_TEMPLATENAME_H
15 #define LLVM_CLANG_AST_TEMPLATENAME_H
16
17 #include "llvm/ADT/FoldingSet.h"
18 #include "llvm/ADT/PointerUnion.h"
19 #include "clang/Basic/OperatorKinds.h"
20
21 namespace llvm {
22   class raw_ostream;
23 }
24
25 namespace clang {
26   
27 class ASTContext;
28 class DependentTemplateName;
29 class DiagnosticBuilder;
30 class IdentifierInfo;
31 class NestedNameSpecifier;
32 class OverloadedTemplateStorage;
33 struct PrintingPolicy;
34 class QualifiedTemplateName;
35 class NamedDecl;
36 class SubstTemplateTemplateParmStorage;
37 class SubstTemplateTemplateParmPackStorage;
38 class TemplateArgument;
39 class TemplateDecl;
40 class TemplateTemplateParmDecl;
41   
42 /// \brief Implementation class used to describe either a set of overloaded
43 /// template names or an already-substituted template template parameter pack.
44 class UncommonTemplateNameStorage {
45 protected:
46   enum Kind {
47     Overloaded,
48     SubstTemplateTemplateParm,
49     SubstTemplateTemplateParmPack
50   };
51
52   union {
53     struct {
54       /// \brief A Kind.
55       unsigned Kind : 2;
56       
57       /// \brief The number of stored templates or template arguments,
58       /// depending on which subclass we have.
59       unsigned Size : 30;
60     } Bits;
61     
62     void *PointerAlignment;
63   };
64   
65   UncommonTemplateNameStorage(Kind kind, unsigned size) {
66     Bits.Kind = kind;
67     Bits.Size = size;
68   }
69   
70 public:
71   unsigned size() const { return Bits.Size; }
72   
73   OverloadedTemplateStorage *getAsOverloadedStorage()  {
74     return Bits.Kind == Overloaded
75              ? reinterpret_cast<OverloadedTemplateStorage *>(this) 
76              : 0;
77   }
78   
79   SubstTemplateTemplateParmStorage *getAsSubstTemplateTemplateParm() {
80     return Bits.Kind == SubstTemplateTemplateParm
81              ? reinterpret_cast<SubstTemplateTemplateParmStorage *>(this)
82              : 0;
83   }
84
85   SubstTemplateTemplateParmPackStorage *getAsSubstTemplateTemplateParmPack() {
86     return Bits.Kind == SubstTemplateTemplateParmPack
87              ? reinterpret_cast<SubstTemplateTemplateParmPackStorage *>(this)
88              : 0;
89   }
90 };
91   
92 /// \brief A structure for storing the information associated with an
93 /// overloaded template name.
94 class OverloadedTemplateStorage : public UncommonTemplateNameStorage {
95   friend class ASTContext;
96
97   OverloadedTemplateStorage(unsigned size) 
98     : UncommonTemplateNameStorage(Overloaded, size) { }
99
100   NamedDecl **getStorage() {
101     return reinterpret_cast<NamedDecl **>(this + 1);
102   }
103   NamedDecl * const *getStorage() const {
104     return reinterpret_cast<NamedDecl *const *>(this + 1);
105   }
106
107 public:
108   typedef NamedDecl *const *iterator;
109
110   iterator begin() const { return getStorage(); }
111   iterator end() const { return getStorage() + size(); }
112 };
113
114 /// \brief A structure for storing an already-substituted template template
115 /// parameter pack.
116 ///
117 /// This kind of template names occurs when the parameter pack has been 
118 /// provided with a template template argument pack in a context where its
119 /// enclosing pack expansion could not be fully expanded.
120 class SubstTemplateTemplateParmPackStorage
121   : public UncommonTemplateNameStorage, public llvm::FoldingSetNode
122 {
123   TemplateTemplateParmDecl *Parameter;
124   const TemplateArgument *Arguments;
125   
126 public:
127   SubstTemplateTemplateParmPackStorage(TemplateTemplateParmDecl *Parameter,
128                                        unsigned Size, 
129                                        const TemplateArgument *Arguments)
130     : UncommonTemplateNameStorage(SubstTemplateTemplateParmPack, Size),
131       Parameter(Parameter), Arguments(Arguments) { }
132   
133   /// \brief Retrieve the template template parameter pack being substituted.
134   TemplateTemplateParmDecl *getParameterPack() const {
135     return Parameter;
136   }
137   
138   /// \brief Retrieve the template template argument pack with which this
139   /// parameter was substituted.
140   TemplateArgument getArgumentPack() const;
141   
142   void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context);
143   
144   static void Profile(llvm::FoldingSetNodeID &ID,
145                       ASTContext &Context,
146                       TemplateTemplateParmDecl *Parameter,
147                       const TemplateArgument &ArgPack);
148 };
149
150 /// \brief Represents a C++ template name within the type system.
151 ///
152 /// A C++ template name refers to a template within the C++ type
153 /// system. In most cases, a template name is simply a reference to a
154 /// class template, e.g.
155 ///
156 /// \code
157 /// template<typename T> class X { };
158 ///
159 /// X<int> xi;
160 /// \endcode
161 ///
162 /// Here, the 'X' in \c X<int> is a template name that refers to the
163 /// declaration of the class template X, above. Template names can
164 /// also refer to function templates, C++0x template aliases, etc.
165 ///
166 /// Some template names are dependent. For example, consider:
167 ///
168 /// \code
169 /// template<typename MetaFun, typename T1, typename T2> struct apply2 {
170 ///   typedef typename MetaFun::template apply<T1, T2>::type type;
171 /// };
172 /// \endcode
173 ///
174 /// Here, "apply" is treated as a template name within the typename
175 /// specifier in the typedef. "apply" is a nested template, and can
176 /// only be understood in the context of
177 class TemplateName {
178   typedef llvm::PointerUnion4<TemplateDecl *,
179                               UncommonTemplateNameStorage *,
180                               QualifiedTemplateName *,
181                               DependentTemplateName *> StorageType;
182
183   StorageType Storage;
184
185   explicit TemplateName(void *Ptr) {
186     Storage = StorageType::getFromOpaqueValue(Ptr);
187   }
188
189 public:
190   // \brief Kind of name that is actually stored.
191   enum NameKind {
192     /// \brief A single template declaration.
193     Template,
194     /// \brief A set of overloaded template declarations.
195     OverloadedTemplate,
196     /// \brief A qualified template name, where the qualification is kept 
197     /// to describe the source code as written.
198     QualifiedTemplate,
199     /// \brief A dependent template name that has not been resolved to a 
200     /// template (or set of templates).
201     DependentTemplate,
202     /// \brief A template template parameter that has been substituted
203     /// for some other template name.
204     SubstTemplateTemplateParm,
205     /// \brief A template template parameter pack that has been substituted for 
206     /// a template template argument pack, but has not yet been expanded into
207     /// individual arguments.
208     SubstTemplateTemplateParmPack
209   };
210
211   TemplateName() : Storage() { }
212   explicit TemplateName(TemplateDecl *Template) : Storage(Template) { }
213   explicit TemplateName(OverloadedTemplateStorage *Storage)
214     : Storage(Storage) { }
215   explicit TemplateName(SubstTemplateTemplateParmStorage *Storage);
216   explicit TemplateName(SubstTemplateTemplateParmPackStorage *Storage)
217     : Storage(Storage) { }
218   explicit TemplateName(QualifiedTemplateName *Qual) : Storage(Qual) { }
219   explicit TemplateName(DependentTemplateName *Dep) : Storage(Dep) { }
220
221   /// \brief Determine whether this template name is NULL.
222   bool isNull() const { return Storage.isNull(); }
223   
224   // \brief Get the kind of name that is actually stored.
225   NameKind getKind() const;
226
227   /// \brief Retrieve the underlying template declaration that
228   /// this template name refers to, if known.
229   ///
230   /// \returns The template declaration that this template name refers
231   /// to, if any. If the template name does not refer to a specific
232   /// declaration because it is a dependent name, or if it refers to a
233   /// set of function templates, returns NULL.
234   TemplateDecl *getAsTemplateDecl() const;
235
236   /// \brief Retrieve the underlying, overloaded function template
237   // declarations that this template name refers to, if known.
238   ///
239   /// \returns The set of overloaded function templates that this template
240   /// name refers to, if known. If the template name does not refer to a
241   /// specific set of function templates because it is a dependent name or
242   /// refers to a single template, returns NULL.
243   OverloadedTemplateStorage *getAsOverloadedTemplate() const {
244     if (UncommonTemplateNameStorage *Uncommon = 
245                               Storage.dyn_cast<UncommonTemplateNameStorage *>())
246       return Uncommon->getAsOverloadedStorage();
247     
248     return 0;
249   }
250
251   /// \brief Retrieve the substituted template template parameter, if 
252   /// known.
253   ///
254   /// \returns The storage for the substituted template template parameter,
255   /// if known. Otherwise, returns NULL.
256   SubstTemplateTemplateParmStorage *getAsSubstTemplateTemplateParm() const {
257     if (UncommonTemplateNameStorage *uncommon = 
258           Storage.dyn_cast<UncommonTemplateNameStorage *>())
259       return uncommon->getAsSubstTemplateTemplateParm();
260     
261     return 0;
262   }
263
264   /// \brief Retrieve the substituted template template parameter pack, if 
265   /// known.
266   ///
267   /// \returns The storage for the substituted template template parameter pack,
268   /// if known. Otherwise, returns NULL.
269   SubstTemplateTemplateParmPackStorage *
270   getAsSubstTemplateTemplateParmPack() const {
271     if (UncommonTemplateNameStorage *Uncommon = 
272         Storage.dyn_cast<UncommonTemplateNameStorage *>())
273       return Uncommon->getAsSubstTemplateTemplateParmPack();
274     
275     return 0;
276   }
277
278   /// \brief Retrieve the underlying qualified template name
279   /// structure, if any.
280   QualifiedTemplateName *getAsQualifiedTemplateName() const {
281     return Storage.dyn_cast<QualifiedTemplateName *>();
282   }
283
284   /// \brief Retrieve the underlying dependent template name
285   /// structure, if any.
286   DependentTemplateName *getAsDependentTemplateName() const {
287     return Storage.dyn_cast<DependentTemplateName *>();
288   }
289
290   TemplateName getUnderlying() const;
291
292   /// \brief Determines whether this is a dependent template name.
293   bool isDependent() const;
294
295   /// \brief Determines whether this is a template name that somehow
296   /// depends on a template parameter.
297   bool isInstantiationDependent() const;
298
299   /// \brief Determines whether this template name contains an
300   /// unexpanded parameter pack (for C++0x variadic templates).
301   bool containsUnexpandedParameterPack() const;
302
303   /// \brief Print the template name.
304   ///
305   /// \param OS the output stream to which the template name will be
306   /// printed.
307   ///
308   /// \param SuppressNNS if true, don't print the
309   /// nested-name-specifier that precedes the template name (if it has
310   /// one).
311   void print(llvm::raw_ostream &OS, const PrintingPolicy &Policy,
312              bool SuppressNNS = false) const;
313
314   /// \brief Debugging aid that dumps the template name to standard
315   /// error.
316   void dump() const;
317
318   void Profile(llvm::FoldingSetNodeID &ID) {
319     ID.AddPointer(Storage.getOpaqueValue());
320   }
321
322   /// \brief Retrieve the template name as a void pointer.
323   void *getAsVoidPointer() const { return Storage.getOpaqueValue(); }
324
325   /// \brief Build a template name from a void pointer.
326   static TemplateName getFromVoidPointer(void *Ptr) {
327     return TemplateName(Ptr);
328   }
329 };
330
331 /// Insertion operator for diagnostics.  This allows sending TemplateName's
332 /// into a diagnostic with <<.
333 const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
334                                     TemplateName N);
335
336 /// \brief A structure for storing the information associated with a
337 /// substituted template template parameter.
338 class SubstTemplateTemplateParmStorage
339   : public UncommonTemplateNameStorage, public llvm::FoldingSetNode {
340   friend class ASTContext;
341
342   TemplateTemplateParmDecl *Parameter;
343   TemplateName Replacement;
344
345   SubstTemplateTemplateParmStorage(TemplateTemplateParmDecl *parameter,
346                                    TemplateName replacement)
347     : UncommonTemplateNameStorage(SubstTemplateTemplateParm, 0),
348       Parameter(parameter), Replacement(replacement) {}
349
350 public:
351   TemplateTemplateParmDecl *getParameter() const { return Parameter; }
352   TemplateName getReplacement() const { return Replacement; }
353
354   void Profile(llvm::FoldingSetNodeID &ID);
355   
356   static void Profile(llvm::FoldingSetNodeID &ID,
357                       TemplateTemplateParmDecl *parameter,
358                       TemplateName replacement);
359 };
360
361 inline TemplateName::TemplateName(SubstTemplateTemplateParmStorage *Storage)
362   : Storage(Storage) { }
363
364 inline TemplateName TemplateName::getUnderlying() const {
365   if (SubstTemplateTemplateParmStorage *subst
366         = getAsSubstTemplateTemplateParm())
367     return subst->getReplacement().getUnderlying();
368   return *this;
369 }
370
371 /// \brief Represents a template name that was expressed as a
372 /// qualified name.
373 ///
374 /// This kind of template name refers to a template name that was
375 /// preceded by a nested name specifier, e.g., \c std::vector. Here,
376 /// the nested name specifier is "std::" and the template name is the
377 /// declaration for "vector". The QualifiedTemplateName class is only
378 /// used to provide "sugar" for template names that were expressed
379 /// with a qualified name, and has no semantic meaning. In this
380 /// manner, it is to TemplateName what ElaboratedType is to Type,
381 /// providing extra syntactic sugar for downstream clients.
382 class QualifiedTemplateName : public llvm::FoldingSetNode {
383   /// \brief The nested name specifier that qualifies the template name.
384   ///
385   /// The bit is used to indicate whether the "template" keyword was
386   /// present before the template name itself. Note that the
387   /// "template" keyword is always redundant in this case (otherwise,
388   /// the template name would be a dependent name and we would express
389   /// this name with DependentTemplateName).
390   llvm::PointerIntPair<NestedNameSpecifier *, 1> Qualifier;
391
392   /// \brief The template declaration or set of overloaded function templates
393   /// that this qualified name refers to.
394   TemplateDecl *Template;
395
396   friend class ASTContext;
397
398   QualifiedTemplateName(NestedNameSpecifier *NNS, bool TemplateKeyword,
399                         TemplateDecl *Template)
400     : Qualifier(NNS, TemplateKeyword? 1 : 0),
401       Template(Template) { }
402
403 public:
404   /// \brief Return the nested name specifier that qualifies this name.
405   NestedNameSpecifier *getQualifier() const { return Qualifier.getPointer(); }
406
407   /// \brief Whether the template name was prefixed by the "template"
408   /// keyword.
409   bool hasTemplateKeyword() const { return Qualifier.getInt(); }
410
411   /// \brief The template declaration that this qualified name refers
412   /// to.
413   TemplateDecl *getDecl() const { return Template; }
414
415   /// \brief The template declaration to which this qualified name
416   /// refers.
417   TemplateDecl *getTemplateDecl() const { return Template; }
418
419   void Profile(llvm::FoldingSetNodeID &ID) {
420     Profile(ID, getQualifier(), hasTemplateKeyword(), getTemplateDecl());
421   }
422
423   static void Profile(llvm::FoldingSetNodeID &ID, NestedNameSpecifier *NNS,
424                       bool TemplateKeyword, TemplateDecl *Template) {
425     ID.AddPointer(NNS);
426     ID.AddBoolean(TemplateKeyword);
427     ID.AddPointer(Template);
428   }
429 };
430
431 /// \brief Represents a dependent template name that cannot be
432 /// resolved prior to template instantiation.
433 ///
434 /// This kind of template name refers to a dependent template name,
435 /// including its nested name specifier (if any). For example,
436 /// DependentTemplateName can refer to "MetaFun::template apply",
437 /// where "MetaFun::" is the nested name specifier and "apply" is the
438 /// template name referenced. The "template" keyword is implied.
439 class DependentTemplateName : public llvm::FoldingSetNode {
440   /// \brief The nested name specifier that qualifies the template
441   /// name.
442   ///
443   /// The bit stored in this qualifier describes whether the \c Name field
444   /// is interpreted as an IdentifierInfo pointer (when clear) or as an
445   /// overloaded operator kind (when set).
446   llvm::PointerIntPair<NestedNameSpecifier *, 1, bool> Qualifier;
447
448   /// \brief The dependent template name.
449   union {
450     /// \brief The identifier template name.
451     ///
452     /// Only valid when the bit on \c Qualifier is clear.
453     const IdentifierInfo *Identifier;
454     
455     /// \brief The overloaded operator name.
456     ///
457     /// Only valid when the bit on \c Qualifier is set.
458     OverloadedOperatorKind Operator;
459   };
460
461   /// \brief The canonical template name to which this dependent
462   /// template name refers.
463   ///
464   /// The canonical template name for a dependent template name is
465   /// another dependent template name whose nested name specifier is
466   /// canonical.
467   TemplateName CanonicalTemplateName;
468
469   friend class ASTContext;
470
471   DependentTemplateName(NestedNameSpecifier *Qualifier,
472                         const IdentifierInfo *Identifier)
473     : Qualifier(Qualifier, false), Identifier(Identifier), 
474       CanonicalTemplateName(this) { }
475
476   DependentTemplateName(NestedNameSpecifier *Qualifier,
477                         const IdentifierInfo *Identifier,
478                         TemplateName Canon)
479     : Qualifier(Qualifier, false), Identifier(Identifier), 
480       CanonicalTemplateName(Canon) { }
481
482   DependentTemplateName(NestedNameSpecifier *Qualifier,
483                         OverloadedOperatorKind Operator)
484   : Qualifier(Qualifier, true), Operator(Operator), 
485     CanonicalTemplateName(this) { }
486   
487   DependentTemplateName(NestedNameSpecifier *Qualifier,
488                         OverloadedOperatorKind Operator,
489                         TemplateName Canon)
490   : Qualifier(Qualifier, true), Operator(Operator), 
491     CanonicalTemplateName(Canon) { }
492   
493 public:
494   /// \brief Return the nested name specifier that qualifies this name.
495   NestedNameSpecifier *getQualifier() const { return Qualifier.getPointer(); }
496
497   /// \brief Determine whether this template name refers to an identifier.
498   bool isIdentifier() const { return !Qualifier.getInt(); }
499
500   /// \brief Returns the identifier to which this template name refers.
501   const IdentifierInfo *getIdentifier() const { 
502     assert(isIdentifier() && "Template name isn't an identifier?");
503     return Identifier;
504   }
505   
506   /// \brief Determine whether this template name refers to an overloaded
507   /// operator.
508   bool isOverloadedOperator() const { return Qualifier.getInt(); }
509   
510   /// \brief Return the overloaded operator to which this template name refers.
511   OverloadedOperatorKind getOperator() const { 
512     assert(isOverloadedOperator() &&
513            "Template name isn't an overloaded operator?");
514     return Operator; 
515   }
516   
517   void Profile(llvm::FoldingSetNodeID &ID) {
518     if (isIdentifier())
519       Profile(ID, getQualifier(), getIdentifier());
520     else
521       Profile(ID, getQualifier(), getOperator());
522   }
523
524   static void Profile(llvm::FoldingSetNodeID &ID, NestedNameSpecifier *NNS,
525                       const IdentifierInfo *Identifier) {
526     ID.AddPointer(NNS);
527     ID.AddBoolean(false);
528     ID.AddPointer(Identifier);
529   }
530
531   static void Profile(llvm::FoldingSetNodeID &ID, NestedNameSpecifier *NNS,
532                       OverloadedOperatorKind Operator) {
533     ID.AddPointer(NNS);
534     ID.AddBoolean(true);
535     ID.AddInteger(Operator);
536   }
537 };
538
539 } // end namespace clang.
540
541 namespace llvm {
542
543 /// \brief The clang::TemplateName class is effectively a pointer.
544 template<>
545 class PointerLikeTypeTraits<clang::TemplateName> {
546 public:
547   static inline void *getAsVoidPointer(clang::TemplateName TN) {
548     return TN.getAsVoidPointer();
549   }
550
551   static inline clang::TemplateName getFromVoidPointer(void *Ptr) {
552     return clang::TemplateName::getFromVoidPointer(Ptr);
553   }
554
555   // No bits are available!
556   enum { NumLowBitsAvailable = 0 };
557 };
558
559 } // end namespace llvm.
560
561 #endif