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 | e68a38f0a8abcd86da39917f035d69f1c8c12a62 (patch) | |
tree | 3fc7d24667e533ad843bfd7499755619ae7d00bd /clang/lib/Sema/SemaTemplateInstantiate.cpp | |
parent | 792c22dbd477c26955e86577d7e49f981060c644 (diff) | |
download | bcm5719-llvm-e68a38f0a8abcd86da39917f035d69f1c8c12a62.tar.gz bcm5719-llvm-e68a38f0a8abcd86da39917f035d69f1c8c12a62.zip |
Fix crash if substitution fails during deduction of variable template partial specialization arguments.
llvm-svn: 290484
Diffstat (limited to 'clang/lib/Sema/SemaTemplateInstantiate.cpp')
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiate.cpp | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 382c23ce87f..4f2e74740df 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/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); |