public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Matthias Kretz <m.kretz@gsi.de>
To: <gcc-patches@gcc.gnu.org>, Jason Merrill <jason@redhat.com>
Subject: Re: [RFC] c++: Print function template parms when relevant (was: [PATCH v4] c++: Add gnu::diagnose_as attribute)
Date: Mon, 8 Nov 2021 21:00:22 +0100	[thread overview]
Message-ID: <1752408.vAW0rqQIy0@excalibur> (raw)
In-Reply-To: <1694479.jsd7nNDzyu@excalibur>

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.kretz@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
──────────────────────────────────────────────────────────────────────────




  reply	other threads:[~2021-11-08 20:00 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-15 12:21 [PATCH v3] c++: Add gnu::diagnose_as attribute Matthias Kretz
2021-07-23  8:58 ` [PATCH v4] " Matthias Kretz
2021-08-17 18:31   ` Jason Merrill
2021-11-08 16:40     ` [RFC] c++: Print function template parms when relevant (was: [PATCH v4] c++: Add gnu::diagnose_as attribute) Matthias Kretz
2021-11-08 20:00       ` Matthias Kretz [this message]
2021-11-16 20:25         ` Jason Merrill
2021-11-16 20:42           ` Matthias Kretz
2021-11-16 20:49             ` Jason Merrill
2021-11-16 20:51               ` Matthias Kretz
2021-11-17  6:09       ` Jason Merrill
2021-11-17  9:04         ` Matthias Kretz
2021-11-17 18:25           ` Jason Merrill
2021-11-17 22:51             ` Matthias Kretz
2021-11-18 19:24               ` Jason Merrill
2021-11-19  9:53                 ` Matthias Kretz
2021-11-19 12:02                   ` Matthias Kretz
2021-11-19 22:26                   ` Jason Merrill
2021-11-19 23:11                     ` Matthias Kretz
2021-11-26 15:23                     ` [PATCH 0/2] " Matthias Kretz
2021-11-26 15:24                       ` [PATCH 1/2] c++: Print function template parms when relevant Matthias Kretz
2021-12-02  8:35                         ` [PATCH v2 " Matthias Kretz
2021-11-26 15:24                       ` [PATCH 2/2] c++: Print function template parms when relevant [part 2] Matthias Kretz
2021-09-08  2:21   ` [PATCH v4] c++: Add gnu::diagnose_as attribute Jason Merrill
2021-11-15  0:35     ` [PATCH v5] " Matthias Kretz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1752408.vAW0rqQIy0@excalibur \
    --to=m.kretz@gsi.de \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jason@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).