I forgot to mention why I tagged it [RFC]: I needed one more bit of information on the template args TREE_VEC to encode EXPLICIT_TEMPLATE_ARGS_P. Its TREE_CHAIN already points to an integer constant denoting the number of non-default arguments, so I couldn't trivially replace that. Therefore, I used the sign of that integer. I was hoping to find a cleaner solution, though.
-Matthias On Monday, 8 November 2021 17:40:44 CET Matthias Kretz wrote: > On Tuesday, 17 August 2021 20:31:54 CET Jason Merrill wrote: > > > 2. Given a DECL_TI_ARGS tree, can I query whether an argument was > > > deduced > > > or explicitly specified? I'm asking because I still consider diagnostics > > > of function templates unfortunate. `template <class T> void f()` is > > > fine, > > > as is `void f(T) [with T = float]`, but `void f() [with T = float]` > > > could > > > be better. I.e. if the template parameter appears somewhere in the > > > function parameter list, dump_template_parms would only produce noise. > > > If, however, the template parameter was given explicitly, it would be > > > nice if it could show up accordingly in diagnostics. > > > > NON_DEFAULT_TEMPLATE_ARGS_COUNT has that information, though there are > > some issues with it. Attached is my WIP from May to improve it > > somewhat, if that's interesting. > > It is interesting. I used your patch to come up with the attached. Patch. I > must say, I didn't try to read through all the cp/pt.c code to understand > all of what you did there (which is why my ChangeLog entry says "Jason?"), > but it works for me (and all of `make check`). > > Anyway, I'd like to propose the following before finishing my diagnose_as > patch. I believe it's useful to fix this part first. The diagnostic/default- > template-args-[12].C tests show a lot of examples of the intent of this > patch. And the remaining changes to the testsuite show how it changes > diagnostic output. > > ---------------------- 8< -------------------- > > The choice when to print a function template parameter was still > suboptimal. That's because sometimes the function template parameter > list only adds noise, while in other situations the lack of a function > template parameter list makes diagnostic messages hard to understand. > > The general idea of this change is to print template parms wherever they > would appear in the source code as well. Thus, the diagnostics code > needs to know whether any template parameter was given explicitly. > > Signed-off-by: Matthias Kretz <m.kr...@gsi.de> > > gcc/testsuite/ChangeLog: > > * g++.dg/debug/dwarf2/template-params-12n.C: Optionally, allow > DW_AT_default_value. > * g++.dg/diagnostic/default-template-args-1.C: New. > * g++.dg/diagnostic/default-template-args-2.C: New. > * g++.dg/diagnostic/param-type-mismatch-2.C: Expect template > parms in diagnostic. > * g++.dg/ext/pretty1.C: Expect function template specialization > to not pretty-print template parms. > * g++.old-deja/g++.ext/pretty3.C: Ditto. > * g++.old-deja/g++.pt/memtemp77.C: Ditto. > * g++.dg/goacc/template.C: Expect function template parms for > explicit arguments. > * g++.dg/gomp/declare-variant-7.C: Expect no function template > parms for deduced arguments. > * g++.dg/template/error40.C: Expect only non-default template > arguments in diagnostic. > > gcc/cp/ChangeLog: > > * cp-tree.h (GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT): Return > absolute value of stored constant. > (EXPLICIT_TEMPLATE_ARGS_P): New. > (SET_EXPLICIT_TEMPLATE_ARGS_P): New. > (TFF_AS_PRIMARY): New constant. > * error.c (get_non_default_template_args_count): Avoid > GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT if > NON_DEFAULT_TEMPLATE_ARGS_COUNT is a NULL_TREE. Make independent > of flag_pretty_templates. > (dump_template_bindings): Add flags parameter to be passed to > get_non_default_template_args_count. Print only non-default > template arguments. > (dump_function_decl): Call dump_function_name and dump_type of > the DECL_CONTEXT with specialized template and set > TFF_AS_PRIMARY for their flags. > (dump_function_name): Add and document conditions for calling > dump_template_parms. > (dump_template_parms): Print only non-default template > parameters. > * pt.c (determine_specialization): Jason? > (template_parms_level_to_args): Jason? > (copy_template_args): Jason? > (fn_type_unification): Set EXPLICIT_TEMPLATE_ARGS_P on the > template arguments tree if any template parameter was explicitly > given. > (type_unification_real): Jason? > (get_partial_spec_bindings): Jason? > (tsubst_template_args): Determine number of defaulted arguments > from new argument vector, if possible. > --- > gcc/cp/cp-tree.h | 18 +++- > gcc/cp/error.c | 83 ++++++++++++++----- > gcc/cp/pt.c | 58 +++++++++---- > .../g++.dg/debug/dwarf2/template-params-12n.C | 2 +- > .../diagnostic/default-template-args-1.C | 73 ++++++++++++++++ > .../diagnostic/default-template-args-2.C | 37 +++++++++ > .../g++.dg/diagnostic/param-type-mismatch-2.C | 2 +- > gcc/testsuite/g++.dg/ext/pretty1.C | 2 +- > gcc/testsuite/g++.dg/goacc/template.C | 8 +- > gcc/testsuite/g++.dg/gomp/declare-variant-7.C | 4 +- > gcc/testsuite/g++.dg/template/error40.C | 6 +- > gcc/testsuite/g++.old-deja/g++.ext/pretty3.C | 2 +- > gcc/testsuite/g++.old-deja/g++.pt/memtemp77.C | 2 +- > 13 files changed, 242 insertions(+), 55 deletions(-) > create mode 100644 > gcc/testsuite/g++.dg/diagnostic/default-template-args-1.C create mode > 100644 gcc/testsuite/g++.dg/diagnostic/default-template-args-2.C -- ────────────────────────────────────────────────────────────────────────── Dr. Matthias Kretz https://mattkretz.github.io GSI Helmholtz Centre for Heavy Ion Research https://gsi.de stdₓ::simd ──────────────────────────────────────────────────────────────────────────