diff options
Diffstat (limited to 'lib/Sema/SemaTemplate.cpp')
| -rw-r--r-- | lib/Sema/SemaTemplate.cpp | 370 | 
1 files changed, 198 insertions, 172 deletions
diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index 4dbf3e45b387..f56b05406d07 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -333,7 +333,8 @@ void Sema::LookupTemplateName(LookupResult &Found,          if (LookupCtx)            Diag(Found.getNameLoc(), diag::err_no_member_template_suggest)              << Name << LookupCtx << CorrectedQuotedStr << SS.getRange() -            << FixItHint::CreateReplacement(Found.getNameLoc(), CorrectedStr); +            << FixItHint::CreateReplacement(Corrected.getCorrectionRange(), +                                            CorrectedStr);          else            Diag(Found.getNameLoc(), diag::err_no_template_suggest)              << Name << CorrectedQuotedStr @@ -1104,6 +1105,9 @@ Sema::CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK,    if (Attr)      ProcessDeclAttributeList(S, NewClass, Attr); +  if (PrevClassTemplate) +    mergeDeclAttributes(NewClass, PrevClassTemplate->getTemplatedDecl()); +    AddPushedVisibilityAttribute(NewClass);    if (TUK != TUK_Friend) @@ -1138,8 +1142,6 @@ Sema::CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK,      NewTemplate->setInvalidDecl();      NewClass->setInvalidDecl();    } -  if (PrevClassTemplate) -    mergeDeclAttributes(NewClass, PrevClassTemplate->getTemplatedDecl());    ActOnDocumentableDecl(NewTemplate); @@ -1204,11 +1206,17 @@ static bool DiagnoseDefaultTemplateArgument(Sema &S,  /// of a template template parameter, recursively.  static bool DiagnoseUnexpandedParameterPacks(Sema &S,                                               TemplateTemplateParmDecl *TTP) { +  // A template template parameter which is a parameter pack is also a pack +  // expansion. +  if (TTP->isParameterPack()) +    return false; +    TemplateParameterList *Params = TTP->getTemplateParameters();    for (unsigned I = 0, N = Params->size(); I != N; ++I) {      NamedDecl *P = Params->getParam(I);      if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P)) { -      if (S.DiagnoseUnexpandedParameterPack(NTTP->getLocation(), +      if (!NTTP->isParameterPack() && +          S.DiagnoseUnexpandedParameterPack(NTTP->getLocation(),                                              NTTP->getTypeSourceInfo(),                                        Sema::UPPC_NonTypeTemplateParameterType))          return true; @@ -1321,7 +1329,8 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,      } else if (NonTypeTemplateParmDecl *NewNonTypeParm                 = dyn_cast<NonTypeTemplateParmDecl>(*NewParam)) {        // Check for unexpanded parameter packs. -      if (DiagnoseUnexpandedParameterPack(NewNonTypeParm->getLocation(), +      if (!NewNonTypeParm->isParameterPack() && +          DiagnoseUnexpandedParameterPack(NewNonTypeParm->getLocation(),                                            NewNonTypeParm->getTypeSourceInfo(),                                            UPPC_NonTypeTemplateParameterType)) {          Invalid = true; @@ -1342,7 +1351,8 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,        if (NewNonTypeParm->isParameterPack()) {          assert(!NewNonTypeParm->hasDefaultArgument() &&                 "Parameter packs can't have a default argument!"); -        SawParameterPack = true; +        if (!NewNonTypeParm->isPackExpansion()) +          SawParameterPack = true;        } else if (OldNonTypeParm && OldNonTypeParm->hasDefaultArgument() &&            NewNonTypeParm->hasDefaultArgument()) {          OldDefaultLoc = OldNonTypeParm->getDefaultArgumentLoc(); @@ -1389,7 +1399,8 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,        if (NewTemplateParm->isParameterPack()) {          assert(!NewTemplateParm->hasDefaultArgument() &&                 "Parameter packs can't have a default argument!"); -        SawParameterPack = true; +        if (!NewTemplateParm->isPackExpansion()) +          SawParameterPack = true;        } else if (OldTemplateParm && OldTemplateParm->hasDefaultArgument() &&            NewTemplateParm->hasDefaultArgument()) {          OldDefaultLoc = OldTemplateParm->getDefaultArgument().getLocation(); @@ -1416,10 +1427,10 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,          MissingDefaultArg = true;      } -    // C++0x [temp.param]p11: +    // C++11 [temp.param]p11:      //   If a template parameter of a primary class template or alias template      //   is a template parameter pack, it shall be the last template parameter. -    if (SawParameterPack && (NewParam + 1) != NewParamEnd &&  +    if (SawParameterPack && (NewParam + 1) != NewParamEnd &&          (TPC == TPC_ClassTemplate || TPC == TPC_TypeAliasTemplate)) {        Diag((*NewParam)->getLocation(),             diag::err_template_param_pack_must_be_last_template_parameter); @@ -1998,9 +2009,11 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,      for (unsigned I = 0; I < Depth; ++I)        TemplateArgLists.addOuterTemplateArguments(0, 0); +    LocalInstantiationScope Scope(*this);      InstantiatingTemplate Inst(*this, TemplateLoc, Template);      if (Inst)        return QualType(); +      CanonType = SubstType(Pattern->getUnderlyingType(),                            TemplateArgLists, AliasTemplate->getLocation(),                            AliasTemplate->getDeclName()); @@ -2085,7 +2098,8 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,                                                       Converted.data(),                                                       Converted.size(), 0);        ClassTemplate->AddSpecialization(Decl, InsertPos); -      Decl->setLexicalDeclContext(CurContext); +      if (ClassTemplate->isOutOfLine()) +        Decl->setLexicalDeclContext(ClassTemplate->getLexicalDeclContext());      }      CanonType = Context.getTypeDeclType(Decl); @@ -2137,7 +2151,6 @@ Sema::ActOnTemplateIdType(CXXScopeSpec &SS, SourceLocation TemplateKWLoc,    }    QualType Result = CheckTemplateIdType(Template, TemplateLoc, TemplateArgs); -  TemplateArgsIn.release();    if (Result.isNull())      return true; @@ -2831,6 +2844,7 @@ bool Sema::CheckTemplateArgument(NamedDecl *Param,      case TemplateArgument::Declaration:      case TemplateArgument::Integral: +    case TemplateArgument::NullPtr:        // We've already checked this template argument, so just copy        // it to the list of converted arguments.        Converted.push_back(Arg.getArgument()); @@ -2947,7 +2961,7 @@ bool Sema::CheckTemplateArgument(NamedDecl *Param,    case TemplateArgument::Template:    case TemplateArgument::TemplateExpansion: -    if (CheckTemplateArgument(TempParm, Arg)) +    if (CheckTemplateArgument(TempParm, Arg, ArgumentPackIndex))        return true;      Converted.push_back(Arg.getArgument()); @@ -2965,6 +2979,8 @@ bool Sema::CheckTemplateArgument(NamedDecl *Param,      llvm_unreachable("Declaration argument with template template parameter");    case TemplateArgument::Integral:      llvm_unreachable("Integral argument with template template parameter"); +  case TemplateArgument::NullPtr: +    llvm_unreachable("Null pointer argument with template template parameter");    case TemplateArgument::Pack:      llvm_unreachable("Caller must expand template argument packs"); @@ -2996,6 +3012,33 @@ static bool diagnoseArityMismatch(Sema &S, TemplateDecl *Template,    return true;  } +/// \brief Check whether the template parameter is a pack expansion, and if so, +/// determine the number of parameters produced by that expansion. For instance: +/// +/// \code +/// template<typename ...Ts> struct A { +///   template<Ts ...NTs, template<Ts> class ...TTs, typename ...Us> struct B; +/// }; +/// \endcode +/// +/// In \c A<int,int>::B, \c NTs and \c TTs have expanded pack size 2, and \c Us +/// is not a pack expansion, so returns an empty Optional. +static llvm::Optional<unsigned> getExpandedPackSize(NamedDecl *Param) { +  if (NonTypeTemplateParmDecl *NTTP +        = dyn_cast<NonTypeTemplateParmDecl>(Param)) { +    if (NTTP->isExpandedParameterPack()) +      return NTTP->getNumExpansionTypes(); +  } + +  if (TemplateTemplateParmDecl *TTP +        = dyn_cast<TemplateTemplateParmDecl>(Param)) { +    if (TTP->isExpandedParameterPack()) +      return TTP->getNumExpansionTemplateParameters(); +  } + +  return llvm::Optional<unsigned>(); +} +  /// \brief Check that the given template argument list is well-formed  /// for specializing the given template.  bool Sema::CheckTemplateArgumentList(TemplateDecl *Template, @@ -3008,15 +3051,9 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,      *ExpansionIntoFixedList = false;    TemplateParameterList *Params = Template->getTemplateParameters(); -  unsigned NumParams = Params->size(); -  unsigned NumArgs = TemplateArgs.size(); -  bool Invalid = false;    SourceLocation RAngleLoc = TemplateArgs.getRAngleLoc(); -  bool HasParameterPack = -    NumParams > 0 && Params->getParam(NumParams - 1)->isTemplateParameterPack(); -      // C++ [temp.arg]p1:    //   [...] The type and form of each template-argument specified in    //   a template-id shall match the type and form specified for the @@ -3024,38 +3061,50 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,    //   template-parameter-list.    bool isTemplateTemplateParameter = isa<TemplateTemplateParmDecl>(Template);    SmallVector<TemplateArgument, 2> ArgumentPack; -  TemplateParameterList::iterator Param = Params->begin(), -                               ParamEnd = Params->end(); -  unsigned ArgIdx = 0; +  unsigned ArgIdx = 0, NumArgs = TemplateArgs.size();    LocalInstantiationScope InstScope(*this, true); -  bool SawPackExpansion = false; -  while (Param != ParamEnd) { -    if (ArgIdx < NumArgs) { -      // If we have an expanded parameter pack, make sure we don't have too -      // many arguments. -      // FIXME: This really should fall out from the normal arity checking. -      if (NonTypeTemplateParmDecl *NTTP -                                = dyn_cast<NonTypeTemplateParmDecl>(*Param)) { -        if (NTTP->isExpandedParameterPack() && -            ArgumentPack.size() >= NTTP->getNumExpansionTypes()) { -          Diag(TemplateLoc, diag::err_template_arg_list_different_arity) -            << true -            << (isa<ClassTemplateDecl>(Template)? 0 : -                isa<FunctionTemplateDecl>(Template)? 1 : -                isa<TemplateTemplateParmDecl>(Template)? 2 : 3) -            << Template; -          Diag(Template->getLocation(), diag::note_template_decl_here) -            << Params->getSourceRange(); -          return true; -        } +  for (TemplateParameterList::iterator Param = Params->begin(), +                                       ParamEnd = Params->end(); +       Param != ParamEnd; /* increment in loop */) { +    // If we have an expanded parameter pack, make sure we don't have too +    // many arguments. +    if (llvm::Optional<unsigned> Expansions = getExpandedPackSize(*Param)) { +      if (*Expansions == ArgumentPack.size()) { +        // We're done with this parameter pack. Pack up its arguments and add +        // them to the list. +        Converted.push_back( +          TemplateArgument::CreatePackCopy(Context, +                                           ArgumentPack.data(), +                                           ArgumentPack.size())); +        ArgumentPack.clear(); + +        // This argument is assigned to the next parameter. +        ++Param; +        continue; +      } else if (ArgIdx == NumArgs && !PartialTemplateArgs) { +        // Not enough arguments for this parameter pack. +        Diag(TemplateLoc, diag::err_template_arg_list_different_arity) +          << false +          << (isa<ClassTemplateDecl>(Template)? 0 : +              isa<FunctionTemplateDecl>(Template)? 1 : +              isa<TemplateTemplateParmDecl>(Template)? 2 : 3) +          << Template; +        Diag(Template->getLocation(), diag::note_template_decl_here) +          << Params->getSourceRange(); +        return true;        } +    } +    if (ArgIdx < NumArgs) {        // Check the template argument we were given.        if (CheckTemplateArgument(*Param, TemplateArgs[ArgIdx], Template,                                  TemplateLoc, RAngleLoc,                                  ArgumentPack.size(), Converted))          return true; +      // We're now done with this argument. +      ++ArgIdx; +        if ((*Param)->isTemplateParameterPack()) {          // The template parameter was a template parameter pack, so take the          // deduced argument and place it on the argument pack. Note that we @@ -3067,16 +3116,47 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,          // Move to the next template parameter.          ++Param;        } -       -      // If this template argument is a pack expansion, record that fact -      // and break out; we can't actually check any more. -      if (TemplateArgs[ArgIdx].getArgument().isPackExpansion()) { -        SawPackExpansion = true; -        ++ArgIdx; -        break; + +      // If we just saw a pack expansion, then directly convert the remaining +      // arguments, because we don't know what parameters they'll match up +      // with. +      if (TemplateArgs[ArgIdx-1].getArgument().isPackExpansion()) { +        bool InFinalParameterPack = Param != ParamEnd && +                                    Param + 1 == ParamEnd && +                                    (*Param)->isTemplateParameterPack() && +                                    !getExpandedPackSize(*Param); + +        if (!InFinalParameterPack && !ArgumentPack.empty()) { +          // If we were part way through filling in an expanded parameter pack, +          // fall back to just producing individual arguments. +          Converted.insert(Converted.end(), +                           ArgumentPack.begin(), ArgumentPack.end()); +          ArgumentPack.clear(); +        } + +        while (ArgIdx < NumArgs) { +          if (InFinalParameterPack) +            ArgumentPack.push_back(TemplateArgs[ArgIdx].getArgument()); +          else +            Converted.push_back(TemplateArgs[ArgIdx].getArgument()); +          ++ArgIdx; +        } + +        // Push the argument pack onto the list of converted arguments. +        if (InFinalParameterPack) { +          Converted.push_back( +            TemplateArgument::CreatePackCopy(Context, +                                             ArgumentPack.data(), +                                             ArgumentPack.size())); +          ArgumentPack.clear(); +        } else if (ExpansionIntoFixedList) { +          // We have expanded a pack into a fixed list. +          *ExpansionIntoFixedList = true; +        } + +        return false;        } -       -      ++ArgIdx; +        continue;      } @@ -3087,14 +3167,30 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,                                                           ArgumentPack.data(),                                                           ArgumentPack.size())); -      return Invalid; +      return false;      }      // If we have a template parameter pack with no more corresponding      // arguments, just break out now and we'll fill in the argument pack below. -    if ((*Param)->isTemplateParameterPack()) -      break; -     +    if ((*Param)->isTemplateParameterPack()) { +      assert(!getExpandedPackSize(*Param) && +             "Should have dealt with this already"); + +      // A non-expanded parameter pack before the end of the parameter list +      // only occurs for an ill-formed template parameter list, unless we've +      // got a partial argument list for a function template, so just bail out. +      if (Param + 1 != ParamEnd) +        return true; + +      Converted.push_back(TemplateArgument::CreatePackCopy(Context, +                                                       ArgumentPack.data(), +                                                       ArgumentPack.size())); +      ArgumentPack.clear(); + +      ++Param; +      continue; +    } +      // Check whether we have a default argument.      TemplateArgumentLoc Arg; @@ -3181,86 +3277,12 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,      ++ArgIdx;    } -  // If we saw a pack expansion, then directly convert the remaining arguments, -  // because we don't know what parameters they'll match up with. -  if (SawPackExpansion) { -    bool AddToArgumentPack -      = Param != ParamEnd && (*Param)->isTemplateParameterPack(); -    while (ArgIdx < NumArgs) { -      if (AddToArgumentPack) -        ArgumentPack.push_back(TemplateArgs[ArgIdx].getArgument()); -      else -        Converted.push_back(TemplateArgs[ArgIdx].getArgument()); -      ++ArgIdx; -    } - -    // Push the argument pack onto the list of converted arguments. -    if (AddToArgumentPack) { -      if (ArgumentPack.empty()) -        Converted.push_back(TemplateArgument(0, 0)); -      else { -        Converted.push_back( -          TemplateArgument::CreatePackCopy(Context, -                                           ArgumentPack.data(), -                                           ArgumentPack.size())); -        ArgumentPack.clear(); -      }       -    } else if (ExpansionIntoFixedList) { -      // We have expanded a pack into a fixed list. -      *ExpansionIntoFixedList = true; -    } - -    return Invalid; -  } -    // If we have any leftover arguments, then there were too many arguments.    // Complain and fail.    if (ArgIdx < NumArgs)      return diagnoseArityMismatch(*this, Template, TemplateLoc, TemplateArgs); -   -  // If we have an expanded parameter pack, make sure we don't have too -  // many arguments. -  // FIXME: This really should fall out from the normal arity checking. -  if (Param != ParamEnd) { -    if (NonTypeTemplateParmDecl *NTTP -          = dyn_cast<NonTypeTemplateParmDecl>(*Param)) { -      if (NTTP->isExpandedParameterPack() && -          ArgumentPack.size() < NTTP->getNumExpansionTypes()) { -        Diag(TemplateLoc, diag::err_template_arg_list_different_arity) -          << false -          << (isa<ClassTemplateDecl>(Template)? 0 : -              isa<FunctionTemplateDecl>(Template)? 1 : -              isa<TemplateTemplateParmDecl>(Template)? 2 : 3) -          << Template; -        Diag(Template->getLocation(), diag::note_template_decl_here) -          << Params->getSourceRange(); -        return true; -      } -    } -  } -   -  // Form argument packs for each of the parameter packs remaining. -  while (Param != ParamEnd) { -    // If we're checking a partial list of template arguments, don't fill -    // in arguments for non-template parameter packs. -    if ((*Param)->isTemplateParameterPack()) { -      if (!HasParameterPack) -        return true; -      if (ArgumentPack.empty()) -        Converted.push_back(TemplateArgument(0, 0)); -      else { -        Converted.push_back(TemplateArgument::CreatePackCopy(Context, -                                                          ArgumentPack.data(), -                                                         ArgumentPack.size())); -        ArgumentPack.clear(); -      } -    } else if (!PartialTemplateArgs) -      return diagnoseArityMismatch(*this, Template, TemplateLoc, TemplateArgs); - -    ++Param; -  } -  return Invalid; +  return false;  }  namespace { @@ -3650,7 +3672,7 @@ CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S,      switch (isNullPointerValueTemplateArgument(S, Param, ParamType, Arg)) {      case NPV_NullPointer:        S.Diag(Arg->getExprLoc(), diag::warn_cxx98_compat_template_arg_null); -      Converted = TemplateArgument((Decl *)0); +      Converted = TemplateArgument(ParamType, /*isNullPtr*/true);        return false;      case NPV_Error: @@ -3738,7 +3760,7 @@ CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S,      return true;    } -  NamedDecl *Entity = DRE->getDecl(); +  ValueDecl *Entity = DRE->getDecl();    // Cannot refer to non-static data members    if (FieldDecl *Field = dyn_cast<FieldDecl>(Entity)) { @@ -3926,7 +3948,8 @@ CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S,    }    // Create the template argument. -  Converted = TemplateArgument(Entity->getCanonicalDecl()); +  Converted = TemplateArgument(cast<ValueDecl>(Entity->getCanonicalDecl()), +                               ParamType->isReferenceType());    S.MarkAnyDeclReferenced(Arg->getLocStart(), Entity);    return false;  } @@ -3947,7 +3970,7 @@ static bool CheckTemplateArgumentPointerToMember(Sema &S,      return true;    case NPV_NullPointer:      S.Diag(Arg->getExprLoc(), diag::warn_cxx98_compat_template_arg_null); -    Converted = TemplateArgument((Decl *)0); +    Converted = TemplateArgument(ParamType, /*isNullPtr*/true);      return false;    case NPV_NotNullPointer:      break; @@ -4016,10 +4039,12 @@ static bool CheckTemplateArgumentPointerToMember(Sema &S,          if (isa<NonTypeTemplateParmDecl>(VD) ||              (isa<VarDecl>(VD) &&               S.Context.getCanonicalType(VD->getType()).isConstQualified())) { -          if (Arg->isTypeDependent() || Arg->isValueDependent()) +          if (Arg->isTypeDependent() || Arg->isValueDependent()) {              Converted = TemplateArgument(Arg); -          else -            Converted = TemplateArgument(VD->getCanonicalDecl()); +          } else { +            VD = cast<ValueDecl>(VD->getCanonicalDecl()); +            Converted = TemplateArgument(VD, /*isReferenceParam*/false); +          }            return Invalid;          }        } @@ -4040,10 +4065,12 @@ static bool CheckTemplateArgumentPointerToMember(Sema &S,      // Okay: this is the address of a non-static member, and therefore      // a member pointer constant. -    if (Arg->isTypeDependent() || Arg->isValueDependent()) +    if (Arg->isTypeDependent() || Arg->isValueDependent()) {        Converted = TemplateArgument(Arg); -    else -      Converted = TemplateArgument(DRE->getDecl()->getCanonicalDecl()); +    } else { +      ValueDecl *D = cast<ValueDecl>(DRE->getDecl()->getCanonicalDecl()); +      Converted = TemplateArgument(D, /*isReferenceParam*/false); +    }      return Invalid;    } @@ -4396,8 +4423,8 @@ ExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,      case NPV_NullPointer:        Diag(Arg->getExprLoc(), diag::warn_cxx98_compat_template_arg_null); -      Converted = TemplateArgument((Decl *)0); -      return Owned(Arg);; +      Converted = TemplateArgument(ParamType, /*isNullPtr*/true); +      return Owned(Arg);      }    } @@ -4417,8 +4444,9 @@ ExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,  /// This routine implements the semantics of C++ [temp.arg.template].  /// It returns true if an error occurred, and false otherwise.  bool Sema::CheckTemplateArgument(TemplateTemplateParmDecl *Param, -                                 const TemplateArgumentLoc &Arg) { -  TemplateName Name = Arg.getArgument().getAsTemplate(); +                                 const TemplateArgumentLoc &Arg, +                                 unsigned ArgumentPackIndex) { +  TemplateName Name = Arg.getArgument().getAsTemplateOrTemplatePattern();    TemplateDecl *Template = Name.getAsTemplateDecl();    if (!Template) {      // Any dependent template name is fine. @@ -4448,8 +4476,12 @@ bool Sema::CheckTemplateArgument(TemplateTemplateParmDecl *Param,        << Template;    } +  TemplateParameterList *Params = Param->getTemplateParameters(); +  if (Param->isExpandedParameterPack()) +    Params = Param->getExpansionTemplateParameters(ArgumentPackIndex); +    return !TemplateParameterListsAreEqual(Template->getTemplateParameters(), -                                         Param->getTemplateParameters(), +                                         Params,                                           true,                                           TPL_TemplateTemplateArgumentMatch,                                           Arg.getLocation()); @@ -4463,12 +4495,9 @@ ExprResult  Sema::BuildExpressionFromDeclTemplateArgument(const TemplateArgument &Arg,                                                QualType ParamType,                                                SourceLocation Loc) { -  assert(Arg.getKind() == TemplateArgument::Declaration && -         "Only declaration template arguments permitted here"); -      // For a NULL non-type template argument, return nullptr casted to the    // parameter's type. -  if (!Arg.getAsDecl()) { +  if (Arg.getKind() == TemplateArgument::NullPtr) {      return ImpCastExprToType(               new (Context) CXXNullPtrLiteralExpr(Context.NullPtrTy, Loc),                               ParamType, @@ -4476,7 +4505,9 @@ Sema::BuildExpressionFromDeclTemplateArgument(const TemplateArgument &Arg,                                 ? CK_NullToMemberPointer                                 : CK_NullToPointer);    } -   +  assert(Arg.getKind() == TemplateArgument::Declaration && +         "Only declaration template arguments permitted here"); +    ValueDecl *VD = cast<ValueDecl>(Arg.getAsDecl());    if (VD->getDeclContext()->isRecord() && @@ -4524,7 +4555,7 @@ Sema::BuildExpressionFromDeclTemplateArgument(const TemplateArgument &Arg,        assert(!RefExpr.isInvalid() &&               Context.hasSameType(((Expr*) RefExpr.get())->getType(),                                   ParamType.getUnqualifiedType())); -      return move(RefExpr); +      return RefExpr;      }    } @@ -4542,7 +4573,7 @@ Sema::BuildExpressionFromDeclTemplateArgument(const TemplateArgument &Arg,        if (RefExpr.isInvalid())          return ExprError(); -      return move(RefExpr); +      return RefExpr;      }      // Take the address of everything else @@ -5071,10 +5102,10 @@ static bool CheckNonTypeClassTemplatePartialSpecializationArgs(Sema &S,        continue;      } -    Expr *ArgExpr = Args[I].getAsExpr(); -    if (!ArgExpr) { +    if (Args[I].getKind() != TemplateArgument::Expression)        continue; -    } + +    Expr *ArgExpr = Args[I].getAsExpr();      // We can have a pack expansion of any of the bullets below.      if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(ArgExpr)) @@ -5173,7 +5204,7 @@ Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec,    // NOTE: KWLoc is the location of the tag keyword. This will instead    // store the location of the outermost template keyword in the declaration.    SourceLocation TemplateKWLoc = TemplateParameterLists.size() > 0 -    ? TemplateParameterLists.get()[0]->getTemplateLoc() : SourceLocation(); +    ? TemplateParameterLists[0]->getTemplateLoc() : SourceLocation();    // Find the class template we're specializing    TemplateName Name = TemplateD.getAsVal<TemplateName>(); @@ -5199,7 +5230,7 @@ Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec,      = MatchTemplateParametersToScopeSpecifier(TemplateNameLoc,                                                 TemplateNameLoc,                                                SS, -                        (TemplateParameterList**)TemplateParameterLists.get(), +                                              TemplateParameterLists.data(),                                                TemplateParameterLists.size(),                                                TUK == TUK_Friend,                                                isExplicitSpecialization, @@ -5354,7 +5385,7 @@ Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec,      if (TemplateParameterLists.size() > 0) {        Specialization->setTemplateParameterListsInfo(Context,                                                TemplateParameterLists.size(), -                    (TemplateParameterList**) TemplateParameterLists.release()); +                                              TemplateParameterLists.data());      }      PrevDecl = 0;      CanonType = Context.getTypeDeclType(Specialization); @@ -5382,7 +5413,7 @@ Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec,                                  TemplateParams,                                  AS_none, /*ModulePrivateLoc=*/SourceLocation(),                                  TemplateParameterLists.size() - 1, -                  (TemplateParameterList**) TemplateParameterLists.release()); +                                TemplateParameterLists.data());      }      // Create a new class template partial specialization declaration node. @@ -5406,7 +5437,7 @@ Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec,      if (TemplateParameterLists.size() > 1 && SS.isSet()) {        Partial->setTemplateParameterListsInfo(Context,                                               TemplateParameterLists.size() - 1, -                    (TemplateParameterList**) TemplateParameterLists.release()); +                                             TemplateParameterLists.data());      }      if (!PrevPartial) @@ -5461,7 +5492,7 @@ Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec,      if (TemplateParameterLists.size() > 0) {        Specialization->setTemplateParameterListsInfo(Context,                                                TemplateParameterLists.size(), -                    (TemplateParameterList**) TemplateParameterLists.release()); +                                              TemplateParameterLists.data());      }      if (!PrevDecl) @@ -5544,7 +5575,6 @@ Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec,      Specialization->setTypeAsWritten(WrittenTy);      Specialization->setTemplateKeywordLoc(TemplateKWLoc);    } -  TemplateArgsIn.release();    // C++ [temp.expl.spec]p9:    //   A template explicit specialization is in the scope of the @@ -5579,7 +5609,7 @@ Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec,  Decl *Sema::ActOnTemplateDeclarator(Scope *S,                                MultiTemplateParamsArg TemplateParameterLists,                                      Declarator &D) { -  Decl *NewDecl = HandleDeclarator(S, D, move(TemplateParameterLists)); +  Decl *NewDecl = HandleDeclarator(S, D, TemplateParameterLists);    ActOnDocumentableDecl(NewDecl);    return NewDecl;  } @@ -5598,7 +5628,7 @@ Decl *Sema::ActOnStartOfFunctionTemplateDef(Scope *FnBodyScope,    D.setFunctionDefinitionKind(FDK_Definition);    Decl *DP = HandleDeclarator(ParentScope, D, -                              move(TemplateParameterLists)); +                              TemplateParameterLists);    if (FunctionTemplateDecl *FunctionTemplate          = dyn_cast_or_null<FunctionTemplateDecl>(DP))      return ActOnStartOfFunctionDef(FnBodyScope, @@ -5902,7 +5932,7 @@ Sema::CheckFunctionTemplateSpecialization(FunctionDecl *FD,        // Perform template argument deduction to determine whether we may be        // specializing this template.        // FIXME: It is somewhat wasteful to build -      TemplateDeductionInfo Info(Context, FD->getLocation()); +      TemplateDeductionInfo Info(FD->getLocation());        FunctionDecl *Specialization = 0;        if (TemplateDeductionResult TDK              = DeduceTemplateArguments(FunTmpl, ExplicitTemplateArgs, @@ -6399,7 +6429,6 @@ Sema::ActOnExplicitInstantiation(Scope *S,                                                  TemplateArgs,                                    Context.getTypeDeclType(Specialization));    Specialization->setTypeAsWritten(WrittenTy); -  TemplateArgsIn.release();    // Set source locations for keywords.    Specialization->setExternLoc(ExternLoc); @@ -6475,9 +6504,8 @@ Sema::ActOnExplicitInstantiation(Scope *S,    Decl *TagD = ActOnTag(S, TagSpec, Sema::TUK_Reference,                          KWLoc, SS, Name, NameLoc, Attr, AS_none,                          /*ModulePrivateLoc=*/SourceLocation(), -                        MultiTemplateParamsArg(*this, 0, 0), -                        Owned, IsDependent, SourceLocation(), false, -                        TypeResult()); +                        MultiTemplateParamsArg(), Owned, IsDependent, +                        SourceLocation(), false, TypeResult());    assert(!IsDependent && "explicit instantiation of dependent name not yet handled");    if (!TagD) @@ -6729,12 +6757,10 @@ DeclResult Sema::ActOnExplicitInstantiation(Scope *S,      TemplateIdAnnotation *TemplateId = D.getName().TemplateId;      TemplateArgs.setLAngleLoc(TemplateId->LAngleLoc);      TemplateArgs.setRAngleLoc(TemplateId->RAngleLoc); -    ASTTemplateArgsPtr TemplateArgsPtr(*this, -                                       TemplateId->getTemplateArgs(), +    ASTTemplateArgsPtr TemplateArgsPtr(TemplateId->getTemplateArgs(),                                         TemplateId->NumArgs);      translateTemplateArguments(TemplateArgsPtr, TemplateArgs);      HasExplicitTemplateArgs = true; -    TemplateArgsPtr.release();    }    // C++ [temp.explicit]p1: @@ -6762,7 +6788,7 @@ DeclResult Sema::ActOnExplicitInstantiation(Scope *S,      if (!FunTmpl)        continue; -    TemplateDeductionInfo Info(Context, D.getIdentifierLoc()); +    TemplateDeductionInfo Info(D.getIdentifierLoc());      FunctionDecl *Specialization = 0;      if (TemplateDeductionResult TDK            = DeduceTemplateArguments(FunTmpl,  | 
