diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-12-24 04:20:31 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-12-24 04:20:31 +0000 |
commit | b296c41c0fff28a3478d061a412f4186a8c2942c (patch) | |
tree | bc8aa443632ed536f9598816c4ac51031e6b4b63 /lib/Sema/SemaTemplateInstantiate.cpp | |
parent | 12d117c5a579a98494429a21cb7963d018d595a5 (diff) |
Fix crash if substitution fails during deduction of variable template partial specialization arguments.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@290484 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaTemplateInstantiate.cpp')
-rw-r--r-- | lib/Sema/SemaTemplateInstantiate.cpp | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index 382c23ce87..4f2e74740d 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -484,29 +484,40 @@ void Sema::PrintInstantiationStack() { break; } - case ActiveTemplateInstantiation::DeducedTemplateArgumentSubstitution: - if (ClassTemplatePartialSpecializationDecl *PartialSpec = - dyn_cast<ClassTemplatePartialSpecializationDecl>(Active->Entity)) { + case ActiveTemplateInstantiation::DeducedTemplateArgumentSubstitution: { + if (FunctionTemplateDecl *FnTmpl = + dyn_cast<FunctionTemplateDecl>(Active->Entity)) { Diags.Report(Active->PointOfInstantiation, - diag::note_partial_spec_deduct_instantiation_here) - << PartialSpec - << getTemplateArgumentBindingsText( - PartialSpec->getTemplateParameters(), + diag::note_function_template_deduction_instantiation_here) + << FnTmpl + << getTemplateArgumentBindingsText(FnTmpl->getTemplateParameters(), Active->TemplateArgs, Active->NumTemplateArgs) << Active->InstantiationRange; } else { - FunctionTemplateDecl *FnTmpl - = cast<FunctionTemplateDecl>(Active->Entity); + bool IsVar = isa<VarTemplateDecl>(Active->Entity) || + isa<VarTemplateSpecializationDecl>(Active->Entity); + TemplateParameterList *Params; + if (auto *D = dyn_cast<ClassTemplatePartialSpecializationDecl>( + Active->Entity)) { + Params = D->getTemplateParameters(); + } else if (auto *D = dyn_cast<VarTemplatePartialSpecializationDecl>( + Active->Entity)) { + Params = D->getTemplateParameters(); + } else { + llvm_unreachable("unexpected template kind"); + } + + //<< Context.getTypeDeclType(PartialSpec) Diags.Report(Active->PointOfInstantiation, - diag::note_function_template_deduction_instantiation_here) - << FnTmpl - << getTemplateArgumentBindingsText(FnTmpl->getTemplateParameters(), - Active->TemplateArgs, + diag::note_deduced_template_arg_substitution_here) + << IsVar << cast<NamedDecl>(Active->Entity) + << getTemplateArgumentBindingsText(Params, Active->TemplateArgs, Active->NumTemplateArgs) << Active->InstantiationRange; } break; + } case ActiveTemplateInstantiation::DefaultFunctionArgumentInstantiation: { ParmVarDecl *Param = cast<ParmVarDecl>(Active->Entity); |