diff options
Diffstat (limited to 'clang/lib/AST')
| -rw-r--r-- | clang/lib/AST/ASTContext.cpp | 36 | ||||
| -rw-r--r-- | clang/lib/AST/ItaniumMangle.cpp | 5 | ||||
| -rw-r--r-- | clang/lib/AST/MicrosoftMangle.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/AST/Type.cpp | 28 | ||||
| -rw-r--r-- | clang/lib/AST/TypePrinter.cpp | 6 | 
5 files changed, 81 insertions, 0 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 3abfe22caa8..35d4b7a0973 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -1932,6 +1932,42 @@ ASTContext::getSubstTemplateTypeParmType(const TemplateTypeParmType *Parm,    return QualType(SubstParm, 0);  } +/// \brief Retrieve a  +QualType ASTContext::getSubstTemplateTypeParmPackType( +                                          const TemplateTypeParmType *Parm, +                                              const TemplateArgument &ArgPack) { +#ifndef NDEBUG +  for (TemplateArgument::pack_iterator P = ArgPack.pack_begin(),  +                                    PEnd = ArgPack.pack_end(); +       P != PEnd; ++P) { +    assert(P->getKind() == TemplateArgument::Type &&"Pack contains a non-type"); +    assert(P->getAsType().isCanonical() && "Pack contains non-canonical type"); +  } +#endif +   +  llvm::FoldingSetNodeID ID; +  SubstTemplateTypeParmPackType::Profile(ID, Parm, ArgPack); +  void *InsertPos = 0; +  if (SubstTemplateTypeParmPackType *SubstParm +        = SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos)) +    return QualType(SubstParm, 0); +   +  QualType Canon; +  if (!Parm->isCanonicalUnqualified()) { +    Canon = getCanonicalType(QualType(Parm, 0)); +    Canon = getSubstTemplateTypeParmPackType(cast<TemplateTypeParmType>(Canon), +                                             ArgPack); +    SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos); +  } + +  SubstTemplateTypeParmPackType *SubstParm +    = new (*this, TypeAlignment) SubstTemplateTypeParmPackType(Parm, Canon, +                                                               ArgPack); +  Types.push_back(SubstParm); +  SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos); +  return QualType(SubstParm, 0);   +} +  /// \brief Retrieve the template type parameter type for a template  /// parameter or parameter pack with the given depth, index, and (optionally)  /// name. diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index 8daba88ea86..0ebd7da679c 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -1383,6 +1383,11 @@ void CXXNameMangler::mangleType(const TemplateTypeParmType *T) {    mangleTemplateParameter(T->getIndex());  } +// <type>           ::= <template-param> +void CXXNameMangler::mangleType(const SubstTemplateTypeParmPackType *T) { +  mangleTemplateParameter(T->getReplacedParameter()->getIndex()); +} +  // <type> ::= P <type>   # pointer-to  void CXXNameMangler::mangleType(const PointerType *T) {    Out << 'P'; diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index ef50899e439..ce53fc21746 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -1011,6 +1011,12 @@ void MicrosoftCXXNameMangler::mangleType(const TemplateTypeParmType *T) {    assert(false && "Don't know how to mangle TemplateTypeParmTypes yet!");  } +void MicrosoftCXXNameMangler::mangleType( +                                       const SubstTemplateTypeParmPackType *T) { +  assert(false &&  +         "Don't know how to mangle SubstTemplateTypeParmPackTypes yet!"); +} +  // <type> ::= <pointer-type>  // <pointer-type> ::= <pointer-cvr-qualifiers> <cvr-qualifiers> <type>  void MicrosoftCXXNameMangler::mangleType(const PointerType *T) { diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index d96993e7bd9..3882f4960ac 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -1244,6 +1244,34 @@ bool EnumType::classof(const TagType *TT) {    return isa<EnumDecl>(TT->getDecl());  } +SubstTemplateTypeParmPackType:: +SubstTemplateTypeParmPackType(const TemplateTypeParmType *Param,  +                              QualType Canon, +                              const TemplateArgument &ArgPack) +  : Type(SubstTemplateTypeParmPack, Canon, true, false, true), Replaced(Param),  +    Arguments(ArgPack.pack_begin()), NumArguments(ArgPack.pack_size())  +{  +} + +TemplateArgument SubstTemplateTypeParmPackType::getArgumentPack() const { +  return TemplateArgument(Arguments, NumArguments); +} + +void SubstTemplateTypeParmPackType::Profile(llvm::FoldingSetNodeID &ID) { +  Profile(ID, getReplacedParameter(), getArgumentPack()); +} + +void SubstTemplateTypeParmPackType::Profile(llvm::FoldingSetNodeID &ID, +                                           const TemplateTypeParmType *Replaced, +                                            const TemplateArgument &ArgPack) { +  ID.AddPointer(Replaced); +  ID.AddInteger(ArgPack.pack_size()); +  for (TemplateArgument::pack_iterator P = ArgPack.pack_begin(),  +                                    PEnd = ArgPack.pack_end(); +       P != PEnd; ++P) +    ID.AddPointer(P->getAsType().getAsOpaquePtr()); +} +  bool TemplateSpecializationType::  anyDependentTemplateArguments(const TemplateArgumentListInfo &Args) {    return anyDependentTemplateArguments(Args.getArgumentArray(), Args.size()); diff --git a/clang/lib/AST/TypePrinter.cpp b/clang/lib/AST/TypePrinter.cpp index ef9704ec858..8a740d4ad8a 100644 --- a/clang/lib/AST/TypePrinter.cpp +++ b/clang/lib/AST/TypePrinter.cpp @@ -568,6 +568,12 @@ void TypePrinter::printSubstTemplateTypeParm(const SubstTemplateTypeParmType *T,    print(T->getReplacementType(), S);  } +void TypePrinter::printSubstTemplateTypeParmPack( +                                        const SubstTemplateTypeParmPackType *T,  +                                             std::string &S) {  +  printTemplateTypeParm(T->getReplacedParameter(), S); +} +  void TypePrinter::printTemplateSpecialization(                                              const TemplateSpecializationType *T,                                                 std::string &S) {   | 

