diff options
| author | Karthik Bhat <kv.bhat@samsung.com> | 2014-05-08 13:16:20 +0000 |
|---|---|---|
| committer | Karthik Bhat <kv.bhat@samsung.com> | 2014-05-08 13:16:20 +0000 |
| commit | 967c13d3fbfaab8eb6cf803aa53036823328b19b (patch) | |
| tree | edfd1efe6311ac4f5de6ab0fbf8d083c8681d854 /clang/lib/Sema/SemaTemplate.cpp | |
| parent | c47b0a1b99e74cab6f4c4aeb58ed3c5154a2d678 (diff) | |
| download | bcm5719-llvm-967c13d3fbfaab8eb6cf803aa53036823328b19b.tar.gz bcm5719-llvm-967c13d3fbfaab8eb6cf803aa53036823328b19b.zip | |
Fix PR19169 [Crash on invalid attempting to specialize a template method as a template variable].
A template declaration of a template name can be null in case we have a dependent name or a set of function templates.
Hence use dyn_cast_or_null instead of dyn_cast. Also improve the diagnostic emitted in this case.
llvm-svn: 208313
Diffstat (limited to 'clang/lib/Sema/SemaTemplate.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index e21d1eef46d..8c0261381c1 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -2420,10 +2420,19 @@ DeclResult Sema::ActOnVarTemplateSpecialization( // The template-id must name a variable template. VarTemplateDecl *VarTemplate = - dyn_cast<VarTemplateDecl>(Name.getAsTemplateDecl()); - if (!VarTemplate) + dyn_cast_or_null<VarTemplateDecl>(Name.getAsTemplateDecl()); + if (!VarTemplate) { + NamedDecl *FnTemplate; + if (auto *OTS = Name.getAsOverloadedTemplate()) + FnTemplate = *OTS->begin(); + else + FnTemplate = dyn_cast_or_null<FunctionTemplateDecl>(Name.getAsTemplateDecl()); + if (FnTemplate) + return Diag(D.getIdentifierLoc(), diag::err_var_spec_no_template_but_method) + << FnTemplate->getDeclName(); return Diag(D.getIdentifierLoc(), diag::err_var_spec_no_template) << IsPartialSpecialization; + } // Check for unexpanded parameter packs in any of the template arguments. for (unsigned I = 0, N = TemplateArgs.size(); I != N; ++I) |

