diff options
Diffstat (limited to 'clang/lib/AST/DeclTemplate.cpp')
| -rw-r--r-- | clang/lib/AST/DeclTemplate.cpp | 50 | 
1 files changed, 36 insertions, 14 deletions
| diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp index 95a2e26e0df84..b5e4ec2d7f43c 100644 --- a/clang/lib/AST/DeclTemplate.cpp +++ b/clang/lib/AST/DeclTemplate.cpp @@ -164,10 +164,15 @@ static void AdoptTemplateParameterList(TemplateParameterList *Params,  void TemplateParameterList::  getAssociatedConstraints(llvm::SmallVectorImpl<const Expr *> &AC) const {    if (HasConstrainedParameters) -    for (const NamedDecl *Param : *this) -      if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) +    for (const NamedDecl *Param : *this) { +      if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {          if (const auto *TC = TTP->getTypeConstraint())            AC.push_back(TC->getImmediatelyDeclaredConstraint()); +      } else if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) { +        if (const Expr *E = NTTP->getPlaceholderTypeConstraint()) +          AC.push_back(E); +      } +    }    if (HasRequiresClause)      AC.push_back(getRequiresClause());  } @@ -483,7 +488,10 @@ static void ProfileTemplateParameterList(ASTContext &C,      if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(D)) {        ID.AddInteger(1);        ID.AddBoolean(TTP->isParameterPack()); -      // TODO: Concepts: profile type-constraints. +      ID.AddBoolean(TTP->hasTypeConstraint()); +      if (const TypeConstraint *TC = TTP->getTypeConstraint()) +        TC->getImmediatelyDeclaredConstraint()->Profile(ID, C, +                                                        /*Canonical=*/true);        continue;      }      const auto *TTP = cast<TemplateTemplateParmDecl>(D); @@ -684,8 +692,14 @@ NonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,                                  unsigned D, unsigned P, IdentifierInfo *Id,                                  QualType T, bool ParameterPack,                                  TypeSourceInfo *TInfo) { -  return new (C, DC) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, -                                             T, ParameterPack, TInfo); +  AutoType *AT = +      C.getLangOpts().CPlusPlus2a ? T->getContainedAutoType() : nullptr; +  return new (C, DC, +              additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>, +                                    Expr *>(0, +                                            AT && AT->isConstrained() ? 1 : 0)) +      NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, T, ParameterPack, +                              TInfo);  }  NonTypeTemplateParmDecl *NonTypeTemplateParmDecl::Create( @@ -693,26 +707,34 @@ NonTypeTemplateParmDecl *NonTypeTemplateParmDecl::Create(      SourceLocation IdLoc, unsigned D, unsigned P, IdentifierInfo *Id,      QualType T, TypeSourceInfo *TInfo, ArrayRef<QualType> ExpandedTypes,      ArrayRef<TypeSourceInfo *> ExpandedTInfos) { +  AutoType *AT = TInfo->getType()->getContainedAutoType();    return new (C, DC, -              additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>>( -                  ExpandedTypes.size())) +              additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>, +                                    Expr *>( +                  ExpandedTypes.size(), AT && AT->isConstrained() ? 1 : 0))        NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, T, TInfo,                                ExpandedTypes, ExpandedTInfos);  }  NonTypeTemplateParmDecl * -NonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) { -  return new (C, ID) NonTypeTemplateParmDecl(nullptr, SourceLocation(), -                                             SourceLocation(), 0, 0, nullptr, -                                             QualType(), false, nullptr); +NonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID, +                                            bool HasTypeConstraint) { +  return new (C, ID, additionalSizeToAlloc<std::pair<QualType, +                                                     TypeSourceInfo *>, +                                           Expr *>(0, +                                                   HasTypeConstraint ? 1 : 0)) +          NonTypeTemplateParmDecl(nullptr, SourceLocation(), SourceLocation(), +                                  0, 0, nullptr, QualType(), false, nullptr);  }  NonTypeTemplateParmDecl *  NonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID, -                                            unsigned NumExpandedTypes) { +                                            unsigned NumExpandedTypes, +                                            bool HasTypeConstraint) {    auto *NTTP = -      new (C, ID, additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>>( -                      NumExpandedTypes)) +      new (C, ID, additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>, +                                        Expr *>( +                      NumExpandedTypes, HasTypeConstraint ? 1 : 0))            NonTypeTemplateParmDecl(nullptr, SourceLocation(), SourceLocation(),                                    0, 0, nullptr, QualType(), nullptr, None,                                    None); | 
