TemplateName.h revision 1eb4433ac451dc16f4133a88af2d002ac26c58ef
17532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//===--- TemplateName.h - C++ Template Name Representation-------*- C++ -*-===//
27532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//
37532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//                     The LLVM Compiler Infrastructure
47532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//
57532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor// This file is distributed under the University of Illinois Open Source
67532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor// License. See LICENSE.TXT for details.
77532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//
87532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//===----------------------------------------------------------------------===//
97532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//
107532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//  This file defines the TemplateName interface and subclasses.
117532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//
127532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//===----------------------------------------------------------------------===//
137532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
147532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#ifndef LLVM_CLANG_AST_TEMPLATENAME_H
157532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#define LLVM_CLANG_AST_TEMPLATENAME_H
167532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
177532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#include "llvm/ADT/FoldingSet.h"
187532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#include "llvm/ADT/PointerUnion.h"
197532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
207532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregornamespace llvm {
217532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  class raw_ostream;
227532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor}
237532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
247532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregornamespace clang {
257532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
267532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass DependentTemplateName;
277532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass IdentifierInfo;
287532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass NestedNameSpecifier;
293b4ea54acf01f72f6eb74d96689dda86d950228fDaniel Dunbarstruct PrintingPolicy;
307532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass QualifiedTemplateName;
31d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregorclass NamedDecl;
327532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass TemplateDecl;
33d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregorclass OverloadedFunctionDecl;
347532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
357532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief Represents a C++ template name within the type system.
367532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
377532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// A C++ template name refers to a template within the C++ type
387532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// system. In most cases, a template name is simply a reference to a
397532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// class template, e.g.
407532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
417532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \code
427532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// template<typename T> class X { };
437532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
447532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// X<int> xi;
457532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \endcode
467532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
477532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// Here, the 'X' in \c X<int> is a template name that refers to the
487532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// declaration of the class template X, above. Template names can
497532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// also refer to function templates, C++0x template aliases, etc.
507532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
517532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// Some template names are dependent. For example, consider:
527532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
537532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \code
547532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// template<typename MetaFun, typename T1, typename T2> struct apply2 {
557532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///   typedef typename MetaFun::template apply<T1, T2>::type type;
567532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// };
577532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \endcode
587532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
597532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// Here, "apply" is treated as a template name within the typename
607532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// specifier in the typedef. "apply" is a nested template, and can
617532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// only be understood in the context of
627532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass TemplateName {
63d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  typedef llvm::PointerUnion4<TemplateDecl *, OverloadedFunctionDecl *,
641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              QualifiedTemplateName *,
657532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                              DependentTemplateName *> StorageType;
667532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
677532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  StorageType Storage;
687532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
697532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  explicit TemplateName(void *Ptr) {
707532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    Storage = StorageType::getFromOpaqueValue(Ptr);
717532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
727532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
737532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorpublic:
747532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  TemplateName() : Storage() { }
757532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  explicit TemplateName(TemplateDecl *Template) : Storage(Template) { }
76d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  explicit TemplateName(OverloadedFunctionDecl *FunctionTemplates)
77d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor    : Storage(FunctionTemplates) { }
787532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  explicit TemplateName(QualifiedTemplateName *Qual) : Storage(Qual) { }
797532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  explicit TemplateName(DependentTemplateName *Dep) : Storage(Dep) { }
807532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
81577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Determine whether this template name is NULL.
82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool isNull() const { return Storage.isNull(); }
831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
847532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Retrieve the the underlying template declaration that
857532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// this template name refers to, if known.
867532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  ///
877532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \returns The template declaration that this template name refers
887532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// to, if any. If the template name does not refer to a specific
891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// declaration because it is a dependent name, or if it refers to a
90d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// set of function templates, returns NULL.
917532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  TemplateDecl *getAsTemplateDecl() const;
927532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Retrieve the the underlying, overloaded function template
94d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  // declarations that this template name refers to, if known.
95d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  ///
961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \returns The set of overloaded function templates that this template
971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// name refers to, if known. If the template name does not refer to a
98d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// specific set of function templates because it is a dependent name or
99d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// refers to a single template, returns NULL.
100d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  OverloadedFunctionDecl *getAsOverloadedFunctionDecl() const;
1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1027532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Retrieve the underlying qualified template name
1037532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// structure, if any.
1047532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  QualifiedTemplateName *getAsQualifiedTemplateName() const {
1057532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    return Storage.dyn_cast<QualifiedTemplateName *>();
1067532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
1077532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1087532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Retrieve the underlying dependent template name
1097532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// structure, if any.
1107532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  DependentTemplateName *getAsDependentTemplateName() const {
1117532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    return Storage.dyn_cast<DependentTemplateName *>();
1127532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
1137532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1147532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Determines whether this is a dependent template name.
1157532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  bool isDependent() const;
1167532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1177532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Print the template name.
1181734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  ///
1191734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  /// \param OS the output stream to which the template name will be
1201734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  /// printed.
1211734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  ///
1221734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  /// \param SuppressNNS if true, don't print the
1231734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  /// nested-name-specifier that precedes the template name (if it has
1241734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  /// one).
125d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  void print(llvm::raw_ostream &OS, const PrintingPolicy &Policy,
126d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor             bool SuppressNNS = false) const;
1277532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
128de650ae96b53eb6109f29fdb5ee51c514259e6e4Douglas Gregor  /// \brief Debugging aid that dumps the template name to standard
129de650ae96b53eb6109f29fdb5ee51c514259e6e4Douglas Gregor  /// error.
1309bde77309fd2f9f7a53446e374472c48c81f5182Douglas Gregor  void dump() const;
131de650ae96b53eb6109f29fdb5ee51c514259e6e4Douglas Gregor
1327532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  void Profile(llvm::FoldingSetNodeID &ID) {
1337532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    ID.AddPointer(Storage.getOpaqueValue());
1347532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
1357532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1367532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Retrieve the template name as a void pointer.
1377532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  void *getAsVoidPointer() const { return Storage.getOpaqueValue(); }
1387532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1397532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Build a template name from a void pointer.
1401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static TemplateName getFromVoidPointer(void *Ptr) {
1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return TemplateName(Ptr);
1427532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
1437532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor};
1447532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1457532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief Represents a template name that was expressed as a
1467532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// qualified name.
1477532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
1487532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// This kind of template name refers to a template name that was
1497532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// preceded by a nested name specifier, e.g., \c std::vector. Here,
1507532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// the nested name specifier is "std::" and the template name is the
1517532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// declaration for "vector". The QualifiedTemplateName class is only
1527532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// used to provide "sugar" for template names that were expressed
1537532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// with a qualified name, and has no semantic meaning. In this
1547532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// manner, it is to TemplateName what QualifiedNameType is to Type,
1557532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// providing extra syntactic sugar for downstream clients.
1567532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass QualifiedTemplateName : public llvm::FoldingSetNode {
1577532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief The nested name specifier that qualifies the template name.
1587532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  ///
1597532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// The bit is used to indicate whether the "template" keyword was
1607532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// present before the template name itself. Note that the
1617532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// "template" keyword is always redundant in this case (otherwise,
1627532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// the template name would be a dependent name and we would express
1637532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// this name with DependentTemplateName).
1647532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  llvm::PointerIntPair<NestedNameSpecifier *, 1> Qualifier;
1657532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
166d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// \brief The template declaration or set of overloaded function templates
167d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// that this qualified name refers to.
168d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  NamedDecl *Template;
1697532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1707532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  friend class ASTContext;
1717532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1727532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  QualifiedTemplateName(NestedNameSpecifier *NNS, bool TemplateKeyword,
1737532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                        TemplateDecl *Template)
1741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    : Qualifier(NNS, TemplateKeyword? 1 : 0),
175d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor      Template(reinterpret_cast<NamedDecl *>(Template)) { }
1767532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
177d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  QualifiedTemplateName(NestedNameSpecifier *NNS, bool TemplateKeyword,
178d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor                        OverloadedFunctionDecl *Template)
1791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  : Qualifier(NNS, TemplateKeyword? 1 : 0),
180d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor    Template(reinterpret_cast<NamedDecl *>(Template)) { }
1811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1827532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorpublic:
1837532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Return the nested name specifier that qualifies this name.
1847532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  NestedNameSpecifier *getQualifier() const { return Qualifier.getPointer(); }
1857532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1867532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Whether the template name was prefixed by the "template"
1877532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// keyword.
1887532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  bool hasTemplateKeyword() const { return Qualifier.getInt(); }
1897532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
190d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// \brief The template declaration or set of overloaded functions that
191d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// that qualified name refers to.
192d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  NamedDecl *getDecl() const { return Template; }
1931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1947532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief The template declaration to which this qualified name
195d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// refers, or NULL if this qualified name refers to a set of overloaded
196d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// function templates.
197d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  TemplateDecl *getTemplateDecl() const;
198d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor
199d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// \brief The set of overloaded function tempaltes to which this qualified
2001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// name refers, or NULL if this qualified name refers to a single
201d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// template declaration.
202d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  OverloadedFunctionDecl *getOverloadedFunctionDecl() const;
2031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2047532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  void Profile(llvm::FoldingSetNodeID &ID) {
205d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor    Profile(ID, getQualifier(), hasTemplateKeyword(), getDecl());
2067532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
2077532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static void Profile(llvm::FoldingSetNodeID &ID, NestedNameSpecifier *NNS,
209d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor                      bool TemplateKeyword, NamedDecl *Template) {
2107532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    ID.AddPointer(NNS);
2117532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    ID.AddBoolean(TemplateKeyword);
2127532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    ID.AddPointer(Template);
2137532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
2147532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor};
2157532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2167532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief Represents a dependent template name that cannot be
2177532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// resolved prior to template instantiation.
2187532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
2197532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// This kind of template name refers to a dependent template name,
2203b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor/// including its nested name specifier (if any). For example,
2217532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// DependentTemplateName can refer to "MetaFun::template apply",
2227532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// where "MetaFun::" is the nested name specifier and "apply" is the
2237532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// template name referenced. The "template" keyword is implied.
2247532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass DependentTemplateName : public llvm::FoldingSetNode {
2257532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief The nested name specifier that qualifies the template
2267532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// name.
2277532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  NestedNameSpecifier *Qualifier;
2287532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2297532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief The dependent template name.
2307532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  const IdentifierInfo *Name;
2317532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2327532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief The canonical template name to which this dependent
2337532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// template name refers.
2347532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  ///
2357532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// The canonical template name for a dependent template name is
2367532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// another dependent template name whose nested name specifier is
2377532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// canonical.
2387532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  TemplateName CanonicalTemplateName;
2397532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2407532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  friend class ASTContext;
2417532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DependentTemplateName(NestedNameSpecifier *Qualifier,
2437532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                        const IdentifierInfo *Name)
2447532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    : Qualifier(Qualifier), Name(Name), CanonicalTemplateName(this) { }
2457532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DependentTemplateName(NestedNameSpecifier *Qualifier,
2477532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                        const IdentifierInfo *Name,
2487532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                        TemplateName Canon)
2497532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    : Qualifier(Qualifier), Name(Name), CanonicalTemplateName(Canon) { }
2507532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2517532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorpublic:
2527532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Return the nested name specifier that qualifies this name.
2537532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  NestedNameSpecifier *getQualifier() const { return Qualifier; }
2547532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2557532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Return the name to which this dependent template name
2567532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// refers.
2577532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  const IdentifierInfo *getName() const { return Name; }
2587532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2597532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  void Profile(llvm::FoldingSetNodeID &ID) {
2607532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    Profile(ID, getQualifier(), getName());
2617532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
2627532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static void Profile(llvm::FoldingSetNodeID &ID, NestedNameSpecifier *NNS,
2647532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                      const IdentifierInfo *Name) {
2657532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    ID.AddPointer(NNS);
2667532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    ID.AddPointer(Name);
2677532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
2687532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor};
2697532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
270c960ee31c7e22a157a8cd31c92d9a9aa945e1e96Chris Lattner} // end namespace clang.
2717532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2727532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregornamespace llvm {
2737532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2747532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief The clang::TemplateName class is effectively a pointer.
2757532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregortemplate<>
2767532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass PointerLikeTypeTraits<clang::TemplateName> {
2777532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorpublic:
2787532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  static inline void *getAsVoidPointer(clang::TemplateName TN) {
2797532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    return TN.getAsVoidPointer();
2807532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
2817532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2827532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  static inline clang::TemplateName getFromVoidPointer(void *Ptr) {
2837532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    return clang::TemplateName::getFromVoidPointer(Ptr);
2847532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
2857532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2867532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  // No bits are available!
2877532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  enum { NumLowBitsAvailable = 0 };
2887532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor};
2897532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
290c960ee31c7e22a157a8cd31c92d9a9aa945e1e96Chris Lattner} // end namespace llvm.
2917532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2927532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#endif
293