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
174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/AST/NestedNameSpecifier.h"
188cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner#include "clang/Basic/LLVM.h"
197532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#include "llvm/ADT/FoldingSet.h"
207532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#include "llvm/ADT/PointerUnion.h"
217532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
227532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregornamespace clang {
231aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
241aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorclass ASTContext;
257532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass DependentTemplateName;
26db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskinclass DiagnosticBuilder;
277532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass IdentifierInfo;
286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass NamedDecl;
297532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass NestedNameSpecifier;
306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesenum OverloadedOperatorKind : int;
311aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorclass OverloadedTemplateStorage;
323b4ea54acf01f72f6eb74d96689dda86d950228fDaniel Dunbarstruct PrintingPolicy;
337532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass QualifiedTemplateName;
341aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorclass SubstTemplateTemplateParmPackStorage;
356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass SubstTemplateTemplateParmStorage;
361aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorclass TemplateArgument;
377532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass TemplateDecl;
381aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorclass TemplateTemplateParmDecl;
391aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
401aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// \brief Implementation class used to describe either a set of overloaded
411aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// template names or an already-substituted template template parameter pack.
421aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorclass UncommonTemplateNameStorage {
431aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorprotected:
44146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  enum Kind {
45146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    Overloaded,
46146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParm,
47146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParmPack
48146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  };
49146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
50e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher  struct BitsTag {
51e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher    /// \brief A Kind.
52e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher    unsigned Kind : 2;
531aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
54e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher    /// \brief The number of stored templates or template arguments,
55e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher    /// depending on which subclass we have.
56e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher    unsigned Size : 30;
57e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher  };
58e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher
59e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher  union {
60e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher    struct BitsTag Bits;
619c34ee65a61bbfb60ae76d4df674f49df1842e70Douglas Gregor    void *PointerAlignment;
620bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  };
639c34ee65a61bbfb60ae76d4df674f49df1842e70Douglas Gregor
64146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  UncommonTemplateNameStorage(Kind kind, unsigned size) {
65146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    Bits.Kind = kind;
66146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    Bits.Size = size;
671aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
681aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
691aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorpublic:
701aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  unsigned size() const { return Bits.Size; }
711aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
721aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  OverloadedTemplateStorage *getAsOverloadedStorage()  {
73146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return Bits.Kind == Overloaded
741aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor             ? reinterpret_cast<OverloadedTemplateStorage *>(this)
756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines             : nullptr;
761aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
771aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
78146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  SubstTemplateTemplateParmStorage *getAsSubstTemplateTemplateParm() {
79146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return Bits.Kind == SubstTemplateTemplateParm
80146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall             ? reinterpret_cast<SubstTemplateTemplateParmStorage *>(this)
816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines             : nullptr;
82146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
83146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
841aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  SubstTemplateTemplateParmPackStorage *getAsSubstTemplateTemplateParmPack() {
85146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return Bits.Kind == SubstTemplateTemplateParmPack
86146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall             ? reinterpret_cast<SubstTemplateTemplateParmPackStorage *>(this)
876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines             : nullptr;
881aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
891aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor};
901aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
911aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// \brief A structure for storing the information associated with an
921aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// overloaded template name.
931aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorclass OverloadedTemplateStorage : public UncommonTemplateNameStorage {
940bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  friend class ASTContext;
950bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall
96146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  OverloadedTemplateStorage(unsigned size)
97146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    : UncommonTemplateNameStorage(Overloaded, size) { }
980bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall
990bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  NamedDecl **getStorage() {
1009c34ee65a61bbfb60ae76d4df674f49df1842e70Douglas Gregor    return reinterpret_cast<NamedDecl **>(this + 1);
1010bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  }
1020bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  NamedDecl * const *getStorage() const {
1039c34ee65a61bbfb60ae76d4df674f49df1842e70Douglas Gregor    return reinterpret_cast<NamedDecl *const *>(this + 1);
1040bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  }
1050bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall
1060bd6feb9e9d40fc889fd47e899985125a43dfed8John McCallpublic:
1070bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  typedef NamedDecl *const *iterator;
1080bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall
1090bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  iterator begin() const { return getStorage(); }
1100bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  iterator end() const { return getStorage() + size(); }
1110bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall};
112146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
1131aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// \brief A structure for storing an already-substituted template template
1141aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// parameter pack.
1151aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor///
1161aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// This kind of template names occurs when the parameter pack has been
1171aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// provided with a template template argument pack in a context where its
1181aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// enclosing pack expansion could not be fully expanded.
1191aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorclass SubstTemplateTemplateParmPackStorage
1201aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  : public UncommonTemplateNameStorage, public llvm::FoldingSetNode
1211aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor{
1221aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  TemplateTemplateParmDecl *Parameter;
1231aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  const TemplateArgument *Arguments;
1241aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
1251aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorpublic:
126146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  SubstTemplateTemplateParmPackStorage(TemplateTemplateParmDecl *Parameter,
1271aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                       unsigned Size,
1281aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                       const TemplateArgument *Arguments)
129146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    : UncommonTemplateNameStorage(SubstTemplateTemplateParmPack, Size),
1301aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor      Parameter(Parameter), Arguments(Arguments) { }
1311aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
1321aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// \brief Retrieve the template template parameter pack being substituted.
1331aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  TemplateTemplateParmDecl *getParameterPack() const {
1341aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    return Parameter;
1351aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
1361aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
1371aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// \brief Retrieve the template template argument pack with which this
1381aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// parameter was substituted.
1391aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  TemplateArgument getArgumentPack() const;
1401aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
141146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context);
1421aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
143146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  static void Profile(llvm::FoldingSetNodeID &ID,
144146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                      ASTContext &Context,
1451aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                      TemplateTemplateParmDecl *Parameter,
1461aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                      const TemplateArgument &ArgPack);
1471aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor};
1487532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1497532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief Represents a C++ template name within the type system.
1507532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
1517532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// A C++ template name refers to a template within the C++ type
1527532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// system. In most cases, a template name is simply a reference to a
1537532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// class template, e.g.
1547532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
1557532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \code
1567532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// template<typename T> class X { };
1577532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
1587532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// X<int> xi;
1597532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \endcode
1607532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
1617532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// Here, the 'X' in \c X<int> is a template name that refers to the
1627532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// declaration of the class template X, above. Template names can
1637532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// also refer to function templates, C++0x template aliases, etc.
1647532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
1657532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// Some template names are dependent. For example, consider:
1667532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
1677532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \code
1687532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// template<typename MetaFun, typename T1, typename T2> struct apply2 {
1697532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///   typedef typename MetaFun::template apply<T1, T2>::type type;
1707532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// };
1717532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \endcode
1727532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
1737532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// Here, "apply" is treated as a template name within the typename
1747532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// specifier in the typedef. "apply" is a nested template, and can
1757532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// only be understood in the context of
1767532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass TemplateName {
1770bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  typedef llvm::PointerUnion4<TemplateDecl *,
1781aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                              UncommonTemplateNameStorage *,
1791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              QualifiedTemplateName *,
1807532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                              DependentTemplateName *> StorageType;
1817532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1827532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  StorageType Storage;
1837532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit TemplateName(void *Ptr);
1857532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1867532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorpublic:
18790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  // \brief Kind of name that is actually stored.
18890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  enum NameKind {
1891aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// \brief A single template declaration.
19090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    Template,
1911aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// \brief A set of overloaded template declarations.
19290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    OverloadedTemplate,
1931aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// \brief A qualified template name, where the qualification is kept
1941aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// to describe the source code as written.
19590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    QualifiedTemplate,
1961aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// \brief A dependent template name that has not been resolved to a
1971aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// template (or set of templates).
1981aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    DependentTemplate,
199146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    /// \brief A template template parameter that has been substituted
200146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    /// for some other template name.
201146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParm,
2021aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// \brief A template template parameter pack that has been substituted for
2031aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// a template template argument pack, but has not yet been expanded into
2041aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// individual arguments.
2051aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    SubstTemplateTemplateParmPack
20690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  };
20790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
2087532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  TemplateName() : Storage() { }
2094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit TemplateName(TemplateDecl *Template);
2104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit TemplateName(OverloadedTemplateStorage *Storage);
211146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  explicit TemplateName(SubstTemplateTemplateParmStorage *Storage);
2124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit TemplateName(SubstTemplateTemplateParmPackStorage *Storage);
2134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit TemplateName(QualifiedTemplateName *Qual);
2144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit TemplateName(DependentTemplateName *Dep);
2157532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
216577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Determine whether this template name is NULL.
2174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool isNull() const;
21890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
21990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  // \brief Get the kind of name that is actually stored.
22090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  NameKind getKind() const;
2211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2221aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// \brief Retrieve the underlying template declaration that
2237532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// this template name refers to, if known.
2247532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  ///
2257532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \returns The template declaration that this template name refers
2267532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// to, if any. If the template name does not refer to a specific
2271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// declaration because it is a dependent name, or if it refers to a
228d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// set of function templates, returns NULL.
2297532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  TemplateDecl *getAsTemplateDecl() const;
2307532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2311aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// \brief Retrieve the underlying, overloaded function template
232d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  // declarations that this template name refers to, if known.
233d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  ///
2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \returns The set of overloaded function templates that this template
2351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// name refers to, if known. If the template name does not refer to a
236d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// specific set of function templates because it is a dependent name or
237d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// refers to a single template, returns NULL.
2384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OverloadedTemplateStorage *getAsOverloadedTemplate() const;
2391aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
240146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  /// \brief Retrieve the substituted template template parameter, if
241146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  /// known.
242146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  ///
243146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  /// \returns The storage for the substituted template template parameter,
244146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  /// if known. Otherwise, returns NULL.
2454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SubstTemplateTemplateParmStorage *getAsSubstTemplateTemplateParm() const;
246146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
2471aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// \brief Retrieve the substituted template template parameter pack, if
2481aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// known.
2491aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  ///
2501aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// \returns The storage for the substituted template template parameter pack,
2511aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// if known. Otherwise, returns NULL.
2521aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  SubstTemplateTemplateParmPackStorage *
2534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  getAsSubstTemplateTemplateParmPack() const;
2541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2557532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Retrieve the underlying qualified template name
2567532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// structure, if any.
2574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  QualifiedTemplateName *getAsQualifiedTemplateName() const;
2587532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2597532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Retrieve the underlying dependent template name
2607532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// structure, if any.
2614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  DependentTemplateName *getAsDependentTemplateName() const;
2627532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
263146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  TemplateName getUnderlying() const;
264146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
2657532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Determines whether this is a dependent template name.
2667532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  bool isDependent() const;
2677532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
268561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  /// \brief Determines whether this is a template name that somehow
269561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  /// depends on a template parameter.
270561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  bool isInstantiationDependent() const;
271561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
272d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  /// \brief Determines whether this template name contains an
273d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  /// unexpanded parameter pack (for C++0x variadic templates).
274d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  bool containsUnexpandedParameterPack() const;
275d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
2767532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Print the template name.
2771734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  ///
2781734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  /// \param OS the output stream to which the template name will be
2791734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  /// printed.
2801734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  ///
2811734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  /// \param SuppressNNS if true, don't print the
2821734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  /// nested-name-specifier that precedes the template name (if it has
2831734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  /// one).
2848cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void print(raw_ostream &OS, const PrintingPolicy &Policy,
285d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor             bool SuppressNNS = false) const;
2867532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
287d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  /// \brief Debugging aid that dumps the template name.
288d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  void dump(raw_ostream &OS) const;
289d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
290de650ae96b53eb6109f29fdb5ee51c514259e6e4Douglas Gregor  /// \brief Debugging aid that dumps the template name to standard
291de650ae96b53eb6109f29fdb5ee51c514259e6e4Douglas Gregor  /// error.
2929bde77309fd2f9f7a53446e374472c48c81f5182Douglas Gregor  void dump() const;
293de650ae96b53eb6109f29fdb5ee51c514259e6e4Douglas Gregor
2947532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  void Profile(llvm::FoldingSetNodeID &ID) {
2957532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    ID.AddPointer(Storage.getOpaqueValue());
2967532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
2977532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2987532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Retrieve the template name as a void pointer.
2997532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  void *getAsVoidPointer() const { return Storage.getOpaqueValue(); }
3007532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
3017532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Build a template name from a void pointer.
3021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static TemplateName getFromVoidPointer(void *Ptr) {
3031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return TemplateName(Ptr);
3047532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
3057532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor};
3067532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
307db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin/// Insertion operator for diagnostics.  This allows sending TemplateName's
308db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin/// into a diagnostic with <<.
309db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskinconst DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
310db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin                                    TemplateName N);
311db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin
312146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall/// \brief A structure for storing the information associated with a
313146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall/// substituted template template parameter.
314146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallclass SubstTemplateTemplateParmStorage
315146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  : public UncommonTemplateNameStorage, public llvm::FoldingSetNode {
316146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  friend class ASTContext;
317146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
318146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  TemplateTemplateParmDecl *Parameter;
319146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  TemplateName Replacement;
320146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
321146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  SubstTemplateTemplateParmStorage(TemplateTemplateParmDecl *parameter,
322146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                                   TemplateName replacement)
323146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    : UncommonTemplateNameStorage(SubstTemplateTemplateParm, 0),
324146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      Parameter(parameter), Replacement(replacement) {}
325146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
326146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallpublic:
327146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  TemplateTemplateParmDecl *getParameter() const { return Parameter; }
328146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  TemplateName getReplacement() const { return Replacement; }
329146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
330146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  void Profile(llvm::FoldingSetNodeID &ID);
331146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
332146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  static void Profile(llvm::FoldingSetNodeID &ID,
333146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                      TemplateTemplateParmDecl *parameter,
334146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                      TemplateName replacement);
335146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall};
336146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
337146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallinline TemplateName TemplateName::getUnderlying() const {
338146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  if (SubstTemplateTemplateParmStorage *subst
339146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall        = getAsSubstTemplateTemplateParm())
340146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return subst->getReplacement().getUnderlying();
341146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  return *this;
342146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall}
343146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3447532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief Represents a template name that was expressed as a
3457532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// qualified name.
3467532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
3477532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// This kind of template name refers to a template name that was
3487532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// preceded by a nested name specifier, e.g., \c std::vector. Here,
3497532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// the nested name specifier is "std::" and the template name is the
3507532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// declaration for "vector". The QualifiedTemplateName class is only
3517532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// used to provide "sugar" for template names that were expressed
3527532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// with a qualified name, and has no semantic meaning. In this
353465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara/// manner, it is to TemplateName what ElaboratedType is to Type,
3547532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// providing extra syntactic sugar for downstream clients.
3557532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass QualifiedTemplateName : public llvm::FoldingSetNode {
3567532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief The nested name specifier that qualifies the template name.
3577532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  ///
3587532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// The bit is used to indicate whether the "template" keyword was
3597532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// present before the template name itself. Note that the
3607532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// "template" keyword is always redundant in this case (otherwise,
3617532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// the template name would be a dependent name and we would express
3627532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// this name with DependentTemplateName).
3637532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  llvm::PointerIntPair<NestedNameSpecifier *, 1> Qualifier;
3647532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
365d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// \brief The template declaration or set of overloaded function templates
366d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// that this qualified name refers to.
3670bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  TemplateDecl *Template;
3687532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
3697532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  friend class ASTContext;
3707532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
3717532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  QualifiedTemplateName(NestedNameSpecifier *NNS, bool TemplateKeyword,
3727532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                        TemplateDecl *Template)
3731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    : Qualifier(NNS, TemplateKeyword? 1 : 0),
3740bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall      Template(Template) { }
3751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3767532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorpublic:
3777532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Return the nested name specifier that qualifies this name.
3787532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  NestedNameSpecifier *getQualifier() const { return Qualifier.getPointer(); }
3797532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
3807532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Whether the template name was prefixed by the "template"
3817532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// keyword.
3827532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  bool hasTemplateKeyword() const { return Qualifier.getInt(); }
3837532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
3840bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  /// \brief The template declaration that this qualified name refers
3850bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  /// to.
3860bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  TemplateDecl *getDecl() const { return Template; }
3871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3887532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief The template declaration to which this qualified name
3890bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  /// refers.
3900bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  TemplateDecl *getTemplateDecl() const { return Template; }
3911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3927532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  void Profile(llvm::FoldingSetNodeID &ID) {
3930bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall    Profile(ID, getQualifier(), hasTemplateKeyword(), getTemplateDecl());
3947532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
3957532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
3961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static void Profile(llvm::FoldingSetNodeID &ID, NestedNameSpecifier *NNS,
3970bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall                      bool TemplateKeyword, TemplateDecl *Template) {
3987532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    ID.AddPointer(NNS);
3997532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    ID.AddBoolean(TemplateKeyword);
4007532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    ID.AddPointer(Template);
4017532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
4027532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor};
4037532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
4047532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief Represents a dependent template name that cannot be
4057532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// resolved prior to template instantiation.
4067532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
4077532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// This kind of template name refers to a dependent template name,
4083b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor/// including its nested name specifier (if any). For example,
4097532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// DependentTemplateName can refer to "MetaFun::template apply",
4107532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// where "MetaFun::" is the nested name specifier and "apply" is the
4117532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// template name referenced. The "template" keyword is implied.
4127532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass DependentTemplateName : public llvm::FoldingSetNode {
4137532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief The nested name specifier that qualifies the template
4147532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// name.
415ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  ///
416ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// The bit stored in this qualifier describes whether the \c Name field
417ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// is interpreted as an IdentifierInfo pointer (when clear) or as an
418ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// overloaded operator kind (when set).
419ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  llvm::PointerIntPair<NestedNameSpecifier *, 1, bool> Qualifier;
4207532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
4217532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief The dependent template name.
422ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  union {
423ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    /// \brief The identifier template name.
424ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    ///
425ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    /// Only valid when the bit on \c Qualifier is clear.
426ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    const IdentifierInfo *Identifier;
427ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
428ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    /// \brief The overloaded operator name.
429ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    ///
430ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    /// Only valid when the bit on \c Qualifier is set.
431ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    OverloadedOperatorKind Operator;
432ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  };
4337532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
4347532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief The canonical template name to which this dependent
4357532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// template name refers.
4367532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  ///
4377532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// The canonical template name for a dependent template name is
4387532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// another dependent template name whose nested name specifier is
4397532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// canonical.
4407532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  TemplateName CanonicalTemplateName;
4417532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
4427532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  friend class ASTContext;
4437532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
4441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DependentTemplateName(NestedNameSpecifier *Qualifier,
445ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                        const IdentifierInfo *Identifier)
446ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    : Qualifier(Qualifier, false), Identifier(Identifier),
447ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      CanonicalTemplateName(this) { }
4487532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
4491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DependentTemplateName(NestedNameSpecifier *Qualifier,
450ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                        const IdentifierInfo *Identifier,
4517532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                        TemplateName Canon)
452ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    : Qualifier(Qualifier, false), Identifier(Identifier),
453ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      CanonicalTemplateName(Canon) { }
4547532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
455ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  DependentTemplateName(NestedNameSpecifier *Qualifier,
456ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                        OverloadedOperatorKind Operator)
457ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  : Qualifier(Qualifier, true), Operator(Operator),
458ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    CanonicalTemplateName(this) { }
459ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
460ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  DependentTemplateName(NestedNameSpecifier *Qualifier,
461ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                        OverloadedOperatorKind Operator,
462ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                        TemplateName Canon)
463ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  : Qualifier(Qualifier, true), Operator(Operator),
464ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    CanonicalTemplateName(Canon) { }
465ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
4667532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorpublic:
4677532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Return the nested name specifier that qualifies this name.
468ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  NestedNameSpecifier *getQualifier() const { return Qualifier.getPointer(); }
4697532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
470ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Determine whether this template name refers to an identifier.
471ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  bool isIdentifier() const { return !Qualifier.getInt(); }
4727532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
473ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Returns the identifier to which this template name refers.
474ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  const IdentifierInfo *getIdentifier() const {
475ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    assert(isIdentifier() && "Template name isn't an identifier?");
476ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    return Identifier;
477ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  }
478ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
479ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Determine whether this template name refers to an overloaded
480ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// operator.
481ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  bool isOverloadedOperator() const { return Qualifier.getInt(); }
482ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
483ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Return the overloaded operator to which this template name refers.
484ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  OverloadedOperatorKind getOperator() const {
485ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    assert(isOverloadedOperator() &&
486ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor           "Template name isn't an overloaded operator?");
487ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    return Operator;
488ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  }
489ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
4907532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  void Profile(llvm::FoldingSetNodeID &ID) {
491ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    if (isIdentifier())
492ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      Profile(ID, getQualifier(), getIdentifier());
493ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    else
494ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      Profile(ID, getQualifier(), getOperator());
495ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  }
496ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
497ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  static void Profile(llvm::FoldingSetNodeID &ID, NestedNameSpecifier *NNS,
498ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                      const IdentifierInfo *Identifier) {
499ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    ID.AddPointer(NNS);
500ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    ID.AddBoolean(false);
501ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    ID.AddPointer(Identifier);
5027532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
5037532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
5041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static void Profile(llvm::FoldingSetNodeID &ID, NestedNameSpecifier *NNS,
505ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                      OverloadedOperatorKind Operator) {
5067532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    ID.AddPointer(NNS);
507ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    ID.AddBoolean(true);
508ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    ID.AddInteger(Operator);
5097532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
5107532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor};
5117532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
512c960ee31c7e22a157a8cd31c92d9a9aa945e1e96Chris Lattner} // end namespace clang.
5137532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
5147532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregornamespace llvm {
5157532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
5167532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief The clang::TemplateName class is effectively a pointer.
5177532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregortemplate<>
5187532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass PointerLikeTypeTraits<clang::TemplateName> {
5197532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorpublic:
5207532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  static inline void *getAsVoidPointer(clang::TemplateName TN) {
5217532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    return TN.getAsVoidPointer();
5227532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
5237532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
5247532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  static inline clang::TemplateName getFromVoidPointer(void *Ptr) {
5257532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    return clang::TemplateName::getFromVoidPointer(Ptr);
5267532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
5277532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
5287532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  // No bits are available!
5297532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  enum { NumLowBitsAvailable = 0 };
5307532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor};
5317532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
532c960ee31c7e22a157a8cd31c92d9a9aa945e1e96Chris Lattner} // end namespace llvm.
5337532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
5347532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#endif
535