diff options
author | Anders Carlsson <andersca@mac.com> | 2009-06-13 00:33:33 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-06-13 00:33:33 +0000 |
commit | 436b156dc87a8687d7ab76a5b60d9c8977303c65 (patch) | |
tree | 9012cabdc270c990d10d752e647abf9b94d5cf56 /lib/Sema/SemaTemplate.cpp | |
parent | 031a5880e19d06624551aed9d74594356f4f9db1 (diff) |
Move template type argument checking out into a separate function. No functionality change.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73275 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaTemplate.cpp')
-rw-r--r-- | lib/Sema/SemaTemplate.cpp | 50 |
1 files changed, 29 insertions, 21 deletions
diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index 78c1a9a97a..f20bcd95ca 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -975,6 +975,33 @@ Sema::ActOnDependentTemplateName(SourceLocation TemplateKWLoc, return TemplateTy::make(Context.getDependentTemplateName(Qualifier, &Name)); } +bool Sema::CheckTemplateTypeArgument(TemplateTypeParmDecl *Param, + const TemplateArgument &Arg, + TemplateArgumentListBuilder &Converted) { + // Check template type parameter. + if (Arg.getKind() != TemplateArgument::Type) { + // C++ [temp.arg.type]p1: + // A template-argument for a template-parameter which is a + // type shall be a type-id. + + // We have a template type parameter but the template argument + // is not a type. + Diag(Arg.getLocation(), diag::err_template_arg_must_be_type); + Diag(Param->getLocation(), diag::note_template_param_here); + + return true; + } + + if (CheckTemplateArgument(Param, Arg.getAsType(), Arg.getLocation())) + return true; + + // Add the converted template type argument. + Converted.push_back( + TemplateArgument(Arg.getLocation(), + Context.getCanonicalType(Arg.getAsType()))); + return false; +} + /// \brief Check that the given template argument list is well-formed /// for specializing the given template. bool Sema::CheckTemplateArgumentList(TemplateDecl *Template, @@ -1085,27 +1112,8 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template, if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) { - // Check template type parameters. - if (Arg.getKind() == TemplateArgument::Type) { - if (CheckTemplateArgument(TTP, Arg.getAsType(), Arg.getLocation())) - Invalid = true; - - // Add the converted template type argument. - Converted.push_back( - TemplateArgument(Arg.getLocation(), - Context.getCanonicalType(Arg.getAsType()))); - continue; - } - - // C++ [temp.arg.type]p1: - // A template-argument for a template-parameter which is a - // type shall be a type-id. - - // We have a template type parameter but the template argument - // is not a type. - Diag(Arg.getLocation(), diag::err_template_arg_must_be_type); - Diag((*Param)->getLocation(), diag::note_template_param_here); - Invalid = true; + if (CheckTemplateTypeArgument(TTP, Arg, Converted)) + Invalid = true; } else if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*Param)) { // Check non-type template parameters. |