Improve diagnostics when printing a template instantiation backtrace
involving substitution of deduced template arguments into a class template partial specialization or function template, or when substituting explicitly-specific template arguments into a function template. We now print the actual deduced argument bindings so the user can see what got deduced. llvm-svn: 99923
This commit is contained in:
parent
2d107f9d1d
commit
607f14168a
@ -1385,13 +1385,13 @@ def note_default_function_arg_instantiation_here : Note<
|
||||
"for '%0' required here">;
|
||||
def note_explicit_template_arg_substitution_here : Note<
|
||||
"while substituting explicitly-specified template arguments into function "
|
||||
"template %0, here">;
|
||||
"template %0 %1">;
|
||||
def note_function_template_deduction_instantiation_here : Note<
|
||||
"while substituting deduced template arguments into function template %0, "
|
||||
"here">;
|
||||
"while substituting deduced template arguments into function template %0 "
|
||||
"%1">;
|
||||
def note_partial_spec_deduct_instantiation_here : Note<
|
||||
"during template argument deduction for class template partial "
|
||||
"specialization %0, here">;
|
||||
"specialization %0 %1">;
|
||||
def note_prior_template_arg_substitution : Note<
|
||||
"while substituting prior template arguments into %select{non-type|template}0"
|
||||
" template parameter%1 %2">;
|
||||
|
||||
@ -394,7 +394,11 @@ void Sema::PrintInstantiationStack() {
|
||||
= cast<FunctionTemplateDecl>((Decl *)Active->Entity);
|
||||
Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
|
||||
diag::note_explicit_template_arg_substitution_here)
|
||||
<< FnTmpl << Active->InstantiationRange;
|
||||
<< FnTmpl
|
||||
<< getTemplateArgumentBindingsText(FnTmpl->getTemplateParameters(),
|
||||
Active->TemplateArgs,
|
||||
Active->NumTemplateArgs)
|
||||
<< Active->InstantiationRange;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -405,13 +409,21 @@ void Sema::PrintInstantiationStack() {
|
||||
Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
|
||||
diag::note_partial_spec_deduct_instantiation_here)
|
||||
<< Context.getTypeDeclType(PartialSpec)
|
||||
<< getTemplateArgumentBindingsText(
|
||||
PartialSpec->getTemplateParameters(),
|
||||
Active->TemplateArgs,
|
||||
Active->NumTemplateArgs)
|
||||
<< Active->InstantiationRange;
|
||||
} else {
|
||||
FunctionTemplateDecl *FnTmpl
|
||||
= cast<FunctionTemplateDecl>((Decl *)Active->Entity);
|
||||
Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
|
||||
diag::note_function_template_deduction_instantiation_here)
|
||||
<< FnTmpl << Active->InstantiationRange;
|
||||
<< FnTmpl
|
||||
<< getTemplateArgumentBindingsText(FnTmpl->getTemplateParameters(),
|
||||
Active->TemplateArgs,
|
||||
Active->NumTemplateArgs)
|
||||
<< Active->InstantiationRange;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@ -7,7 +7,7 @@ template<typename T1> struct if_ {
|
||||
};
|
||||
template <class Model, void (Model::*)()> struct wrap_constraints { };
|
||||
template <class Model>
|
||||
inline char has_constraints_(Model* , // expected-note 4{{while substituting}} \
|
||||
inline char has_constraints_(Model* , // expected-note 4{{while substituting deduced template arguments into function template 'has_constraints_' [with }} \
|
||||
// expected-note 3{{candidate template ignored}}
|
||||
wrap_constraints<Model,&Model::constraints>* = 0); // expected-note 4{{in instantiation}}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user