diff options
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/Sema.h | 24 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 12 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiate.cpp | 67 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 40 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateExpr.cpp | 20 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaType.cpp | 4 | 
6 files changed, 63 insertions, 104 deletions
| diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 21aca40c7d2..83565095509 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -65,6 +65,7 @@ namespace clang {    class TypedefDecl;    class TemplateDecl;    class TemplateArgument; +  class TemplateArgumentList;    class TemplateParameterList;    class TemplateTemplateParmDecl;    class ClassTemplateDecl; @@ -1974,7 +1975,7 @@ public:      uintptr_t Entity;      // \brief If this the instantiation of a default template -    // argument, the list of tempalte arguments. +    // argument, the list of template arguments.      const TemplateArgument *TemplateArgs;      /// \brief The number of template arguments in TemplateArgs. @@ -2074,29 +2075,24 @@ public:    void PrintInstantiationStack(); -  QualType InstantiateType(QualType T, const TemplateArgument *TemplateArgs, -                           unsigned NumTemplateArgs, +  QualType InstantiateType(QualType T, const TemplateArgumentList &TemplateArgs,                             SourceLocation Loc, DeclarationName Entity);    OwningExprResult InstantiateExpr(Expr *E,  -                                   const TemplateArgument *TemplateArgs, -                                   unsigned NumTemplateArgs); +                                   const TemplateArgumentList &TemplateArgs);    Decl *InstantiateDecl(Decl *D, DeclContext *Owner, -                        const TemplateArgument *TemplateArgs, -                        unsigned NumTemplateArgs); +                        const TemplateArgumentList &TemplateArgs);    bool     InstantiateBaseSpecifiers(CXXRecordDecl *Instantiation,                              CXXRecordDecl *Pattern, -                            const TemplateArgument *TemplateArgs, -                            unsigned NumTemplateArgs); +                            const TemplateArgumentList &TemplateArgs);    bool    InstantiateClass(SourceLocation PointOfInstantiation,                     CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, -                   const TemplateArgument *TemplateArgs, -                   unsigned NumTemplateArgs); +                   const TemplateArgumentList &TemplateArgs);    bool     InstantiateClassTemplateSpecialization( @@ -2106,13 +2102,11 @@ public:    NestedNameSpecifier *    InstantiateNestedNameSpecifier(NestedNameSpecifier *NNS,                                   SourceRange Range, -                                 const TemplateArgument *TemplateArgs, -                                 unsigned NumTemplateArgs); +                                 const TemplateArgumentList &TemplateArgs);    TemplateName    InstantiateTemplateName(TemplateName Name, SourceLocation Loc, -                          const TemplateArgument *TemplateArgs, -                          unsigned NumTemplateArgs); +                          const TemplateArgumentList &TemplateArgs);    // Simple function for cloning expressions.    template<typename T>  diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 3938978dfd5..fc44217252a 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -993,7 +993,11 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,                                       Template, &Converted[0],                                        Converted.size(),                                       SourceRange(TemplateLoc, RAngleLoc)); -          ArgType = InstantiateType(ArgType, &Converted[0], Converted.size(), + +          TemplateArgumentList TemplateArgs(Context, &Converted[0], +                                            Converted.size(),  +                                            /*CopyArgs=*/false); +          ArgType = InstantiateType(ArgType, TemplateArgs,                                      TTP->getDefaultArgumentLoc(),                                      TTP->getDeclName());          } @@ -1061,8 +1065,10 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,                                     Converted.size(),                                     SourceRange(TemplateLoc, RAngleLoc)); -        NTTPType = InstantiateType(NTTPType,  -                                   &Converted[0], Converted.size(), +        TemplateArgumentList TemplateArgs(Context, &Converted[0], +                                          Converted.size(),  +                                          /*CopyArgs=*/false); +        NTTPType = InstantiateType(NTTPType, TemplateArgs,                                     NTTP->getLocation(),                                     NTTP->getDeclName());          // If that worked, check the non-type template parameter type diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index ac8f293a803..0fe6cee882c 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -133,19 +133,17 @@ void Sema::PrintInstantiationStack() {  namespace {    class VISIBILITY_HIDDEN TemplateTypeInstantiator {      Sema &SemaRef; -    const TemplateArgument *TemplateArgs; -    unsigned NumTemplateArgs; +    const TemplateArgumentList &TemplateArgs;      SourceLocation Loc;      DeclarationName Entity;    public:      TemplateTypeInstantiator(Sema &SemaRef,  -                             const TemplateArgument *TemplateArgs, -                             unsigned NumTemplateArgs, +                             const TemplateArgumentList &TemplateArgs,                               SourceLocation Loc,                               DeclarationName Entity)         : SemaRef(SemaRef), TemplateArgs(TemplateArgs),  -        NumTemplateArgs(NumTemplateArgs), Loc(Loc), Entity(Entity) { } +        Loc(Loc), Entity(Entity) { }      QualType operator()(QualType T) const { return Instantiate(T); } @@ -298,7 +296,7 @@ InstantiateDependentSizedArrayType(const DependentSizedArrayType *T,    // Instantiate the size expression    Sema::OwningExprResult InstantiatedArraySize =  -    SemaRef.InstantiateExpr(ArraySize, TemplateArgs, NumTemplateArgs); +    SemaRef.InstantiateExpr(ArraySize, TemplateArgs);    if (InstantiatedArraySize.isInvalid())      return QualType(); @@ -403,7 +401,6 @@ InstantiateTemplateTypeParmType(const TemplateTypeParmType *T,    if (T->getDepth() == 0) {      // Replace the template type parameter with its corresponding      // template argument. -    assert(T->getIndex() < NumTemplateArgs && "Wrong # of template args");      assert(TemplateArgs[T->getIndex()].getKind() == TemplateArgument::Type &&             "Template argument kind mismatch");      QualType Result = TemplateArgs[T->getIndex()].getAsType(); @@ -443,7 +440,7 @@ InstantiateTemplateSpecializationType(      switch (Arg->getKind()) {      case TemplateArgument::Type: {        QualType T = SemaRef.InstantiateType(Arg->getAsType(),  -                                           TemplateArgs, NumTemplateArgs, +                                           TemplateArgs,                                              Arg->getLocation(),                                             DeclarationName());        if (T.isNull()) @@ -461,8 +458,7 @@ InstantiateTemplateSpecializationType(      case TemplateArgument::Expression:        Sema::OwningExprResult E  -        = SemaRef.InstantiateExpr(Arg->getAsExpr(), TemplateArgs, -                                  NumTemplateArgs); +        = SemaRef.InstantiateExpr(Arg->getAsExpr(), TemplateArgs);        if (E.isInvalid())          return QualType();        InstantiatedTemplateArgs.push_back(E.takeAs<Expr>()); @@ -475,8 +471,7 @@ InstantiateTemplateSpecializationType(    TemplateName Name = SemaRef.InstantiateTemplateName(T->getTemplateName(),                                                        Loc,  -                                                      TemplateArgs, -                                                      NumTemplateArgs); +                                                      TemplateArgs);    return SemaRef.CheckTemplateIdType(Name, Loc, SourceLocation(),                                       &InstantiatedTemplateArgs[0], @@ -509,7 +504,7 @@ InstantiateTypenameType(const TypenameType *T, unsigned Quals) const {    NestedNameSpecifier *NNS       = SemaRef.InstantiateNestedNameSpecifier(T->getQualifier(),                                                SourceRange(Loc), -                                             TemplateArgs, NumTemplateArgs); +                                             TemplateArgs);    if (!NNS)      return QualType(); @@ -571,9 +566,6 @@ QualType TemplateTypeInstantiator::Instantiate(QualType T) const {  /// \param TemplateArgs the template arguments that will be  /// substituted for the top-level template parameters within T.  /// -/// \param NumTemplateArgs the number of template arguments provided -/// by TemplateArgs. -///  /// \param Loc the location in the source code where this substitution  /// is being performed. It will typically be the location of the  /// declarator (if we're instantiating the type of some declaration) @@ -589,8 +581,7 @@ QualType TemplateTypeInstantiator::Instantiate(QualType T) const {  /// \returns If the instantiation succeeds, the instantiated  /// type. Otherwise, produces diagnostics and returns a NULL type.  QualType Sema::InstantiateType(QualType T,  -                               const TemplateArgument *TemplateArgs, -                               unsigned NumTemplateArgs, +                               const TemplateArgumentList &TemplateArgs,                                 SourceLocation Loc, DeclarationName Entity) {    assert(!ActiveTemplateInstantiations.empty() &&           "Cannot perform an instantiation without some context on the " @@ -600,8 +591,7 @@ QualType Sema::InstantiateType(QualType T,    if (!T->isDependentType())      return T; -  TemplateTypeInstantiator Instantiator(*this, TemplateArgs, NumTemplateArgs, -                                        Loc, Entity); +  TemplateTypeInstantiator Instantiator(*this, TemplateArgs, Loc, Entity);    return Instantiator(T);  } @@ -614,8 +604,7 @@ QualType Sema::InstantiateType(QualType T,  bool   Sema::InstantiateBaseSpecifiers(CXXRecordDecl *Instantiation,                                  CXXRecordDecl *Pattern, -                                const TemplateArgument *TemplateArgs, -                                unsigned NumTemplateArgs) { +                                const TemplateArgumentList &TemplateArgs) {    bool Invalid = false;    llvm::SmallVector<CXXBaseSpecifier*, 8> InstantiatedBases;    for (ClassTemplateSpecializationDecl::base_class_iterator  @@ -628,7 +617,7 @@ Sema::InstantiateBaseSpecifiers(CXXRecordDecl *Instantiation,      }      QualType BaseType = InstantiateType(Base->getType(),  -                                        TemplateArgs, NumTemplateArgs, +                                        TemplateArgs,                                           Base->getSourceRange().getBegin(),                                          DeclarationName());      if (BaseType.isNull()) { @@ -673,15 +662,11 @@ Sema::InstantiateBaseSpecifiers(CXXRecordDecl *Instantiation,  /// \param TemplateArgs The template arguments to be substituted into  /// the pattern.  /// -/// \param NumTemplateArgs The number of templates arguments in -/// TemplateArgs. -///  /// \returns true if an error occurred, false otherwise.  bool  Sema::InstantiateClass(SourceLocation PointOfInstantiation,                         CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, -                       const TemplateArgument *TemplateArgs, -                       unsigned NumTemplateArgs) { +                       const TemplateArgumentList &TemplateArgs) {    bool Invalid = false;    CXXRecordDecl *PatternDef  @@ -715,16 +700,14 @@ Sema::InstantiateClass(SourceLocation PointOfInstantiation,    Instantiation->startDefinition();    // Instantiate the base class specifiers. -  if (InstantiateBaseSpecifiers(Instantiation, Pattern, TemplateArgs, -                                NumTemplateArgs)) +  if (InstantiateBaseSpecifiers(Instantiation, Pattern, TemplateArgs))      Invalid = true;    llvm::SmallVector<DeclPtrTy, 32> Fields;    for (RecordDecl::decl_iterator Member = Pattern->decls_begin(Context),           MemberEnd = Pattern->decls_end(Context);          Member != MemberEnd; ++Member) { -    Decl *NewMember = InstantiateDecl(*Member, Instantiation, -                                      TemplateArgs, NumTemplateArgs); +    Decl *NewMember = InstantiateDecl(*Member, Instantiation, TemplateArgs);      if (NewMember) {        if (NewMember->isInvalidDecl())          Invalid = true; @@ -783,21 +766,18 @@ Sema::InstantiateClassTemplateSpecialization(    return InstantiateClass(ClassTemplateSpec->getLocation(),                            ClassTemplateSpec, Pattern, -                          ClassTemplateSpec->getTemplateArgs(), -                          ClassTemplateSpec->getNumTemplateArgs()); +                          ClassTemplateSpec->getTemplateArgs());  }  /// \brief Instantiate a nested-name-specifier.  NestedNameSpecifier *  Sema::InstantiateNestedNameSpecifier(NestedNameSpecifier *NNS,                                       SourceRange Range, -                                     const TemplateArgument *TemplateArgs, -                                     unsigned NumTemplateArgs) { +                                     const TemplateArgumentList &TemplateArgs) {    // Instantiate the prefix of this nested name specifier.    NestedNameSpecifier *Prefix = NNS->getPrefix();    if (Prefix) { -    Prefix = InstantiateNestedNameSpecifier(Prefix, Range, TemplateArgs, -                                            NumTemplateArgs); +    Prefix = InstantiateNestedNameSpecifier(Prefix, Range, TemplateArgs);      if (!Prefix)        return 0;    } @@ -828,8 +808,7 @@ Sema::InstantiateNestedNameSpecifier(NestedNameSpecifier *NNS,      if (!T->isDependentType())        return NNS; -    T = InstantiateType(T, TemplateArgs, NumTemplateArgs, Range.getBegin(), -                        DeclarationName()); +    T = InstantiateType(T, TemplateArgs, Range.getBegin(), DeclarationName());      if (T.isNull())        return 0; @@ -852,14 +831,12 @@ Sema::InstantiateNestedNameSpecifier(NestedNameSpecifier *NNS,  TemplateName  Sema::InstantiateTemplateName(TemplateName Name, SourceLocation Loc, -                              const TemplateArgument *TemplateArgs, -                              unsigned NumTemplateArgs) { +                              const TemplateArgumentList &TemplateArgs) {    if (TemplateTemplateParmDecl *TTP           = dyn_cast_or_null<TemplateTemplateParmDecl>(                                                   Name.getAsTemplateDecl())) {      assert(TTP->getDepth() == 0 &&              "Cannot reduce depth of a template template parameter"); -    assert(TTP->getPosition() < NumTemplateArgs && "Wrong # of template args");      assert(TemplateArgs[TTP->getPosition()].getAsDecl() &&             "Wrong kind of template template argument");      ClassTemplateDecl *ClassTemplate  @@ -870,7 +847,7 @@ Sema::InstantiateTemplateName(TemplateName Name, SourceLocation Loc,        NestedNameSpecifier *NNS           = InstantiateNestedNameSpecifier(QTN->getQualifier(),                                           /*FIXME=*/SourceRange(Loc), -                                         TemplateArgs, NumTemplateArgs); +                                         TemplateArgs);        if (NNS)          return Context.getQualifiedTemplateName(NNS,                                                   QTN->hasTemplateKeyword(), @@ -882,7 +859,7 @@ Sema::InstantiateTemplateName(TemplateName Name, SourceLocation Loc,      NestedNameSpecifier *NNS         = InstantiateNestedNameSpecifier(DTN->getQualifier(),                                         /*FIXME=*/SourceRange(Loc), -                                       TemplateArgs, NumTemplateArgs); +                                       TemplateArgs);      if (!NNS) // FIXME: Not the best recovery strategy.        return Name; diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index a075ea938d0..b254a40da71 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -23,17 +23,14 @@ namespace {      : public DeclVisitor<TemplateDeclInstantiator, Decl *> {      Sema &SemaRef;      DeclContext *Owner; -    const TemplateArgument *TemplateArgs; -    unsigned NumTemplateArgs; +    const TemplateArgumentList &TemplateArgs;    public:      typedef Sema::OwningExprResult OwningExprResult;      TemplateDeclInstantiator(Sema &SemaRef, DeclContext *Owner, -                             const TemplateArgument *TemplateArgs, -                             unsigned NumTemplateArgs) -      : SemaRef(SemaRef), Owner(Owner), TemplateArgs(TemplateArgs),  -        NumTemplateArgs(NumTemplateArgs) { } +                             const TemplateArgumentList &TemplateArgs) +      : SemaRef(SemaRef), Owner(Owner), TemplateArgs(TemplateArgs) { }      // FIXME: Once we get closer to completion, replace these      // manually-written declarations with automatically-generated ones @@ -83,8 +80,7 @@ Decl *TemplateDeclInstantiator::VisitTypedefDecl(TypedefDecl *D) {    bool Invalid = false;    QualType T = D->getUnderlyingType();    if (T->isDependentType()) { -    T = SemaRef.InstantiateType(T, TemplateArgs, NumTemplateArgs, -                                D->getLocation(), +    T = SemaRef.InstantiateType(T, TemplateArgs, D->getLocation(),                                  D->getDeclName());      if (T.isNull()) {        Invalid = true; @@ -106,7 +102,6 @@ Decl *TemplateDeclInstantiator::VisitTypedefDecl(TypedefDecl *D) {  Decl *TemplateDeclInstantiator::VisitVarDecl(VarDecl *D) {    // Instantiate the type of the declaration    QualType T = SemaRef.InstantiateType(D->getType(), TemplateArgs, -                                       NumTemplateArgs,                                          D->getTypeSpecStartLoc(),                                         D->getDeclName());    if (T.isNull()) @@ -129,7 +124,7 @@ Decl *TemplateDeclInstantiator::VisitVarDecl(VarDecl *D) {    if (D->getInit()) {      OwningExprResult Init  -      = SemaRef.InstantiateExpr(D->getInit(), TemplateArgs, NumTemplateArgs); +      = SemaRef.InstantiateExpr(D->getInit(), TemplateArgs);      if (Init.isInvalid())        Var->setInvalidDecl();      else @@ -144,8 +139,7 @@ Decl *TemplateDeclInstantiator::VisitFieldDecl(FieldDecl *D) {    bool Invalid = false;    QualType T = D->getType();    if (T->isDependentType())  { -    T = SemaRef.InstantiateType(T, TemplateArgs, NumTemplateArgs, -                                D->getLocation(), +    T = SemaRef.InstantiateType(T, TemplateArgs, D->getLocation(),                                   D->getDeclName());      if (!T.isNull() && T->isFunctionType()) {        // C++ [temp.arg.type]p3: @@ -166,7 +160,7 @@ Decl *TemplateDeclInstantiator::VisitFieldDecl(FieldDecl *D) {      BitWidth = 0;    else if (BitWidth) {      OwningExprResult InstantiatedBitWidth -      = SemaRef.InstantiateExpr(BitWidth, TemplateArgs, NumTemplateArgs); +      = SemaRef.InstantiateExpr(BitWidth, TemplateArgs);      if (InstantiatedBitWidth.isInvalid()) {        Invalid = true;        BitWidth = 0; @@ -195,7 +189,7 @@ Decl *TemplateDeclInstantiator::VisitStaticAssertDecl(StaticAssertDecl *D) {    Expr *AssertExpr = D->getAssertExpr();    OwningExprResult InstantiatedAssertExpr -    = SemaRef.InstantiateExpr(AssertExpr, TemplateArgs, NumTemplateArgs); +    = SemaRef.InstantiateExpr(AssertExpr, TemplateArgs);    if (InstantiatedAssertExpr.isInvalid())      return 0; @@ -224,8 +218,7 @@ Decl *TemplateDeclInstantiator::VisitEnumDecl(EnumDecl *D) {      // The specified value for the enumerator.      OwningExprResult Value = SemaRef.Owned((Expr *)0);      if (Expr *UninstValue = EC->getInitExpr()) -      Value = SemaRef.InstantiateExpr(UninstValue,  -                                      TemplateArgs, NumTemplateArgs); +      Value = SemaRef.InstantiateExpr(UninstValue, TemplateArgs);      // Drop the initial value and continue.      bool isInvalid = false; @@ -425,8 +418,7 @@ Decl *TemplateDeclInstantiator::VisitCXXConversionDecl(CXXConversionDecl *D) {  ParmVarDecl *TemplateDeclInstantiator::VisitParmVarDecl(ParmVarDecl *D) {    QualType OrigT = SemaRef.InstantiateType(D->getOriginalType(), TemplateArgs, -                                           NumTemplateArgs, D->getLocation(), -                                           D->getDeclName()); +                                           D->getLocation(), D->getDeclName());    if (OrigT.isNull())      return 0; @@ -469,10 +461,8 @@ TemplateDeclInstantiator::VisitOriginalParmVarDecl(OriginalParmVarDecl *D) {  }  Decl *Sema::InstantiateDecl(Decl *D, DeclContext *Owner, -                            const TemplateArgument *TemplateArgs, -                            unsigned NumTemplateArgs) { -  TemplateDeclInstantiator Instantiator(*this, Owner, TemplateArgs, -                                        NumTemplateArgs); +                            const TemplateArgumentList &TemplateArgs) { +  TemplateDeclInstantiator Instantiator(*this, Owner, TemplateArgs);    return Instantiator.Visit(D);  } @@ -491,8 +481,7 @@ TemplateDeclInstantiator::InstantiateFunctionType(FunctionDecl *D,    bool InvalidDecl = false;    // Instantiate the function parameters -  TemplateDeclInstantiator ParamInstantiator(SemaRef, 0, -                                             TemplateArgs, NumTemplateArgs); +  TemplateDeclInstantiator ParamInstantiator(SemaRef, 0, TemplateArgs);    llvm::SmallVector<QualType, 16> ParamTys;    for (FunctionDecl::param_iterator P = D->param_begin(),                                    PEnd = D->param_end(); @@ -524,8 +513,7 @@ TemplateDeclInstantiator::InstantiateFunctionType(FunctionDecl *D,    const FunctionProtoType *Proto = D->getType()->getAsFunctionProtoType();    assert(Proto && "Missing prototype?");    QualType ResultType  -    = SemaRef.InstantiateType(Proto->getResultType(), -                              TemplateArgs, NumTemplateArgs, +    = SemaRef.InstantiateType(Proto->getResultType(), TemplateArgs,                                 D->getLocation(), D->getDeclName());    if (ResultType.isNull())      return QualType(); diff --git a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp index 5476ad3502b..89d88ff76ec 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp @@ -24,17 +24,14 @@ namespace {    class VISIBILITY_HIDDEN TemplateExprInstantiator       : public StmtVisitor<TemplateExprInstantiator, Sema::OwningExprResult> {      Sema &SemaRef; -    const TemplateArgument *TemplateArgs; -    unsigned NumTemplateArgs; +    const TemplateArgumentList &TemplateArgs;    public:      typedef Sema::OwningExprResult OwningExprResult;      TemplateExprInstantiator(Sema &SemaRef,  -                             const TemplateArgument *TemplateArgs, -                             unsigned NumTemplateArgs) -      : SemaRef(SemaRef), TemplateArgs(TemplateArgs),  -        NumTemplateArgs(NumTemplateArgs) { } +                             const TemplateArgumentList &TemplateArgs) +      : SemaRef(SemaRef), TemplateArgs(TemplateArgs) { }      // FIXME: Once we get closer to completion, replace these      // manually-written declarations with automatically-generated ones @@ -294,7 +291,7 @@ TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {    if (E->isArgumentType()) {      QualType T = E->getArgumentType();      if (T->isDependentType()) { -      T = SemaRef.InstantiateType(T, TemplateArgs, NumTemplateArgs, +      T = SemaRef.InstantiateType(T, TemplateArgs,                                     /*FIXME*/E->getOperatorLoc(),                                  &SemaRef.PP.getIdentifierTable().get("sizeof"));        if (T.isNull()) @@ -324,7 +321,7 @@ TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {    NestedNameSpecifier *NNS       = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),                                                E->getQualifierRange(), -                                             TemplateArgs, NumTemplateArgs); +                                             TemplateArgs);    if (!NNS)      return SemaRef.ExprError(); @@ -348,7 +345,7 @@ TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(                                                    CXXTemporaryObjectExpr *E) {    QualType T = E->getType();    if (T->isDependentType()) { -    T = SemaRef.InstantiateType(T, TemplateArgs, NumTemplateArgs, +    T = SemaRef.InstantiateType(T, TemplateArgs,                                  E->getTypeBeginLoc(), DeclarationName());      if (T.isNull())        return SemaRef.ExprError(); @@ -413,8 +410,7 @@ Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(  }  Sema::OwningExprResult  -Sema::InstantiateExpr(Expr *E, const TemplateArgument *TemplateArgs, -                      unsigned NumTemplateArgs) { -  TemplateExprInstantiator Instantiator(*this, TemplateArgs, NumTemplateArgs); +Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) { +  TemplateExprInstantiator Instantiator(*this, TemplateArgs);    return Instantiator.Visit(E);  } diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 08a5770196f..f3a31ea0deb 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -1115,9 +1115,7 @@ bool Sema::RequireCompleteType(SourceLocation Loc, QualType T, unsigned diag,               Parent && !Spec; Parent = Parent->getParent())            Spec = dyn_cast<ClassTemplateSpecializationDecl>(Parent);          assert(Spec && "Not a member of a class template specialization?"); -        return InstantiateClass(Loc, Rec, Pattern, -                                Spec->getTemplateArgs(),  -                                Spec->getNumTemplateArgs()); +        return InstantiateClass(Loc, Rec, Pattern, Spec->getTemplateArgs());        }      }    } | 

