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