diff options
author | Richard Trieu <rtrieu@google.com> | 2016-04-05 21:13:54 +0000 |
---|---|---|
committer | Richard Trieu <rtrieu@google.com> | 2016-04-05 21:13:54 +0000 |
commit | 265c344ef816a8573562fa27022b8008e0f58198 (patch) | |
tree | 9e48f3b1c08e09cc8d5f984d6d2add72e089010e /clang/lib/Sema/SemaTemplate.cpp | |
parent | 1de3c7e79010c43300a2637c3020a1489a3dd0de (diff) | |
download | bcm5719-llvm-265c344ef816a8573562fa27022b8008e0f58198.tar.gz bcm5719-llvm-265c344ef816a8573562fa27022b8008e0f58198.zip |
Fix a crash on invalid with template handling
This is a fix for https://llvm.org/bugs/show_bug.cgi?id=25561 which was a
crash on invalid. Change the handling of invalid decls to have a catch-all
case to prevent unexpecting decls from triggering an assertion.
llvm-svn: 265467
Diffstat (limited to 'clang/lib/Sema/SemaTemplate.cpp')
-rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 18b739df7f5..fdb7d762d29 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -7277,15 +7277,21 @@ Sema::ActOnExplicitInstantiation(Scope *S, assert(Kind != TTK_Enum && "Invalid enum tag in class template explicit instantiation!"); - if (isa<TypeAliasTemplateDecl>(TD)) { - Diag(KWLoc, diag::err_tag_reference_non_tag) << Kind; - Diag(TD->getTemplatedDecl()->getLocation(), - diag::note_previous_use); + ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(TD); + + if (!ClassTemplate) { + unsigned ErrorKind = 0; + if (isa<TypeAliasTemplateDecl>(TD)) { + ErrorKind = 4; + } else if (isa<TemplateTemplateParmDecl>(TD)) { + ErrorKind = 5; + } + + Diag(TemplateNameLoc, diag::err_tag_reference_non_tag) << ErrorKind; + Diag(TD->getLocation(), diag::note_previous_use); return true; } - ClassTemplateDecl *ClassTemplate = cast<ClassTemplateDecl>(TD); - if (!isAcceptableTagRedeclaration(ClassTemplate->getTemplatedDecl(), Kind, /*isDefinition*/false, KWLoc, ClassTemplate->getIdentifier())) { |