public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jason Merrill <jason@redhat.com>
To: David Malcolm <dmalcolm@redhat.com>
Cc: gcc-patches@gcc.gnu.org
Subject: Re: [PATCH v2] C++: improvements to diagnostics using %P (more PR c++/85110)
Date: Thu, 06 Dec 2018 00:49:00 -0000	[thread overview]
Message-ID: <9b627d17-0203-3b5a-7257-790b8243156c@redhat.com> (raw)
In-Reply-To: <1543877659-41220-1-git-send-email-dmalcolm@redhat.com>

On 12/3/18 5:54 PM, David Malcolm wrote:
> I was going to ping this patch:
>    https://gcc.gnu.org/ml/gcc-patches/2018-11/msg00875.html
> but it has bit-rotted somewhat, so here's a refreshed version of it.
> 
> Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
> 
> OK for trunk?
> 
> Thanks
> Dave
> 
> 
> Blurb from v1:
> 
> This patch is based on grepping the C++ frontend for %P
> i.e. diagnostics that refer to a parameter number.  It fixes up
> these diagnostics to highlight the pertinent param where appropriate
> (and possible), along with various other tweaks, as described in the
> ChangeLog.
> 
> gcc/cp/ChangeLog:
> 	PR c++/85110
> 	* call.c (conversion_null_warnings): Try to use the location of
> 	the expression for the warnings.  Add notes showing the parameter
> 	of the function decl, where available.
> 	(get_fndecl_argument_location): Gracefully reject
> 	non-FUNCTION_DECLs.  For implicitly-declared functions, use the
> 	fndecl location rather than that of the param.
> 	(maybe_inform_about_fndecl_for_bogus_argument_init): New function.
> 	(convert_like_real): Use it in various places to avoid repetition.
> 	* cp-tree.h (maybe_inform_about_fndecl_for_bogus_argument_init):
> 	New declaration.
> 	* decl2.c: Include "gcc-rich-location.h".
> 	(check_default_args): Use the location of the parameter when
> 	complaining about parameters with missing default arguments in
> 	preference to that of the fndecl.
> 	Attempt to record the location of first parameter with a default
> 	argument and add it as a secondary range to such errors.
> 	* typeck.c (convert_arguments): When complaining about parameters
> 	with incomplete types, attempt to use the location of the
> 	argument.  Where available, add a note showing the pertinent
> 	parameter in the fndecl.
> 	(convert_for_assignment): When complaining about bad conversions
> 	at function calls, use the location of the unstripped argument.
> 	(convert_for_initialization): When checking for bogus references,
> 	add an auto_diagnostic_group, and update the note to use the
> 	location of the pertinent parameter, rather than just the callee.
> 
> gcc/testsuite/ChangeLog:
> 	PR c++/85110
> 	* g++.dg/diagnostic/missing-default-args.C: New test.
> 	* g++.dg/diagnostic/param-type-mismatch-3.C: New test.
> 	* g++.dg/diagnostic/param-type-mismatch.C: Add tests for invalid
> 	references and incomplete types.
> 	* g++.dg/warn/Wconversion-null-4.C: New test.
> ---
>   gcc/cp/call.c                                      | 88 ++++++++++++++--------
>   gcc/cp/cp-tree.h                                   |  1 +
>   gcc/cp/decl2.c                                     | 16 +++-
>   gcc/cp/typeck.c                                    | 22 ++++--
>   .../g++.dg/diagnostic/missing-default-args.C       | 53 +++++++++++++
>   .../g++.dg/diagnostic/param-type-mismatch-3.C      | 26 +++++++
>   .../g++.dg/diagnostic/param-type-mismatch.C        | 41 ++++++++++
>   gcc/testsuite/g++.dg/warn/Wconversion-null-4.C     | 43 +++++++++++
>   8 files changed, 251 insertions(+), 39 deletions(-)
>   create mode 100644 gcc/testsuite/g++.dg/diagnostic/missing-default-args.C
>   create mode 100644 gcc/testsuite/g++.dg/diagnostic/param-type-mismatch-3.C
>   create mode 100644 gcc/testsuite/g++.dg/warn/Wconversion-null-4.C
> 
> diff --git a/gcc/cp/call.c b/gcc/cp/call.c
> index ee099cc..cfc5641 100644
> --- a/gcc/cp/call.c
> +++ b/gcc/cp/call.c
> @@ -6681,16 +6681,24 @@ conversion_null_warnings (tree totype, tree expr, tree fn, int argnum)
>     if (null_node_p (expr) && TREE_CODE (totype) != BOOLEAN_TYPE
>         && ARITHMETIC_TYPE_P (totype))
>       {
> -      location_t loc =
> -	expansion_point_location_if_in_system_header (input_location);
> -
>         if (fn)
> -	warning_at (loc, OPT_Wconversion_null,
> -		    "passing NULL to non-pointer argument %P of %qD",
> -		    argnum, fn);
> +	{
> +	  location_t loc = EXPR_LOC_OR_LOC (expr, input_location);
> +	  loc = expansion_point_location_if_in_system_header (loc);
> +	  auto_diagnostic_group d;
> +	  if (warning_at (loc, OPT_Wconversion_null,
> +			  "passing NULL to non-pointer argument %P of %qD",
> +			  argnum, fn))
> +	    inform (get_fndecl_argument_location (fn, argnum),
> +		    "  declared here");
> +	}
>         else
> -	warning_at (loc, OPT_Wconversion_null,
> -		    "converting to non-pointer type %qT from NULL", totype);
> +	{
> +	  location_t loc
> +	    = expansion_point_location_if_in_system_header (input_location);
> +	  warning_at (loc, OPT_Wconversion_null,
> +		      "converting to non-pointer type %qT from NULL", totype);
> +	}

Why is 'loc' different between the branches?

> @@ -6698,9 +6706,15 @@ conversion_null_warnings (tree totype, tree expr, tree fn, int argnum)
>   	   && TYPE_PTR_P (totype))
>       {
>         if (fn)
> -	warning_at (input_location, OPT_Wconversion_null,
> -		    "converting %<false%> to pointer type for argument %P "
> -		    "of %qD", argnum, fn);
> +	{
> +	  location_t loc = EXPR_LOC_OR_LOC (expr, input_location);
> +	  auto_diagnostic_group d;
> +	  if (warning_at (loc, OPT_Wconversion_null,
> +			  "converting %<false%> to pointer type for argument "
> +			  "%P of %qD", argnum, fn))
> +	    inform (get_fndecl_argument_location (fn, argnum),
> +		    "  declared here");
> +	}
>         else
>   	warning_at (input_location, OPT_Wconversion_null,
>   		    "converting %<false%> to pointer type %qT", totype);

Same question.

> @@ -6740,6 +6754,15 @@ maybe_print_user_conv_context (conversion *convs)
>   location_t
>   get_fndecl_argument_location (tree fndecl, int argnum)
>   {
> +  /* Gracefully fail for e.g. TEMPLATE_DECL.  */
> +  if (TREE_CODE (fndecl) != FUNCTION_DECL)
> +    return DECL_SOURCE_LOCATION (fndecl);

For a TEMPLATE_DECL we can use DECL_TEMPLATE_RESULT or STRIP_TEMPLATE to 
get the FUNCTION_DECL.  But I'm somewhat surprised we would get here 
with a TEMPLATE_DECL rather than an instantiation.

> diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
> index ffc0d0d..265826a 100644
> --- a/gcc/cp/decl2.c
> +++ b/gcc/cp/decl2.c
> @@ -48,6 +48,7 @@ along with GCC; see the file COPYING3.  If not see
>   #include "intl.h"
>   #include "c-family/c-ada-spec.h"
>   #include "asan.h"
> +#include "gcc-rich-location.h"
>   
>   /* Id for dumping the raw trees.  */
>   int raw_dump_id;
> @@ -5179,14 +5180,25 @@ check_default_args (tree x)
>   {
>     tree arg = TYPE_ARG_TYPES (TREE_TYPE (x));
>     bool saw_def = false;
> +  location_t loc_of_first_default_arg = UNKNOWN_LOCATION;
>     int i = 0 - (TREE_CODE (TREE_TYPE (x)) == METHOD_TYPE);
>     for (; arg && arg != void_list_node; arg = TREE_CHAIN (arg), ++i)
>       {
>         if (TREE_PURPOSE (arg))
> -	saw_def = true;
> +	{
> +	  saw_def = true;
> +	  location_t loc = get_fndecl_argument_location (x, i);
> +	  if (loc != DECL_SOURCE_LOCATION (x))
> +	    loc_of_first_default_arg = loc;
> +	}
>         else if (saw_def && !PACK_EXPANSION_P (TREE_VALUE (arg)))
>   	{
> -	  error ("default argument missing for parameter %P of %q+#D", i, x);
> +	  location_t loc = get_fndecl_argument_location (x, i);
> +	  gcc_rich_location richloc (loc);
> +	  if (loc_of_first_default_arg != UNKNOWN_LOCATION)
> +	    richloc.add_range (loc_of_first_default_arg);
> +	  error_at (&richloc,
> +		    "default argument missing for parameter %P of %q#D", i, x);

If we're going to highlight the earlier parameter that has a default 
argument, we should mention in the diagnostic why it's relevant.

Jason

  reply	other threads:[~2018-12-06  0:49 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-11 22:59 [PATCH] C++: improvements to diagnostics that use " David Malcolm
2018-12-03 22:06 ` [PATCH v2] C++: improvements to diagnostics using " David Malcolm
2018-12-06  0:49   ` Jason Merrill [this message]
2018-12-06 14:51     ` [PATCH] v3: " David Malcolm
2018-12-06 15:04       ` Jason Merrill

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=9b627d17-0203-3b5a-7257-790b8243156c@redhat.com \
    --to=jason@redhat.com \
    --cc=dmalcolm@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    /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).