OK.

On Thu, Aug 23, 2018 at 11:01 AM, David Malcolm <dmalc...@redhat.com> wrote:
> Consider this bogus code (from g++.dg/diagnostic/param-type-mismatch-2.C):
>
> struct s4 { static int member_1 (int one, const char **two, float three); };
>
> int test_4 (int first, const char *second, float third)
> {
>   return s4::member_1 (first, second, third);
> }
>
> Before this patch, g++ emits:
>
> demo.cc: In function 'int test_4(int, const char*, float)':
> demo.cc:5:44: error: no matching function for call to 's4::member_1(int&, 
> const char*&, float&)'
> 5 |   return s4::member_1 (first, second, third);
>   |                                            ^
> demo.cc:1:24: note: candidate: 'static int s4::member_1(int, const char**, 
> float)'
> 1 | struct s4 { static int member_1 (int one, const char **two, float three); 
> };
>   |                        ^~~~~~~~
> demo.cc:1:24: note:   no known conversion for argument 2 from 'const char*' 
> to 'const char**'
>
> With this patch, it highlights the pertinent parameter in the
> "no known conversion" note:
>
> demo.cc: In function 'int test_4(int, const char*, float)':
> demo.cc:5:44: error: no matching function for call to 's4::member_1(int&, 
> const char*&, float&)'
> 5 |   return s4::member_1 (first, second, third);
>   |                                            ^
> demo.cc:1:24: note: candidate: 'static int s4::member_1(int, const char**, 
> float)'
> 1 | struct s4 { static int member_1 (int one, const char **two, float three); 
> };
>   |                        ^~~~~~~~
> demo.cc:1:56: note:   no known conversion for argument 2 from 'const char*' 
> to 'const char**'
> 1 | struct s4 { static int member_1 (int one, const char **two, float three); 
> };
>   |                                           ~~~~~~~~~~~~~^~~
>
> Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu; adds
> 15 PASS results to g++.sum.
>
> OK for trunk?
>
> I'm working on a followup to highlight the pertinent argument
> in the initial error diagnostic.
>
> gcc/cp/ChangeLog:
>         PR c++/85110
>         * call.c (print_conversion_rejection): Add "fn" param and use it
>         for "no known conversion" messages to underline the pertinent
>         param.
>         (print_z_candidate): Supply "fn" to the new param above.
>
> gcc/testsuite/ChangeLog:
>         PR c++/85110
>         * g++.dg/diagnostic/param-type-mismatch-2.C: Update expected
>         output to reflect underlining of pertinent parameter in decl
>         for "no known conversion" messages.
> ---
>  gcc/cp/call.c                                      | 17 +++++++++------
>  .../g++.dg/diagnostic/param-type-mismatch-2.C      | 25 
> +++++++++++++++++-----
>  2 files changed, 31 insertions(+), 11 deletions(-)
>
> diff --git a/gcc/cp/call.c b/gcc/cp/call.c
> index 626830c..ef445e0 100644
> --- a/gcc/cp/call.c
> +++ b/gcc/cp/call.c
> @@ -3432,10 +3432,11 @@ equal_functions (tree fn1, tree fn2)
>    return fn1 == fn2;
>  }
>
> -/* Print information about a candidate being rejected due to INFO.  */
> +/* Print information about a candidate FN being rejected due to INFO.  */
>
>  static void
> -print_conversion_rejection (location_t loc, struct conversion_info *info)
> +print_conversion_rejection (location_t loc, struct conversion_info *info,
> +                           tree fn)
>  {
>    tree from = info->from;
>    if (!TYPE_P (from))
> @@ -3466,8 +3467,12 @@ print_conversion_rejection (location_t loc, struct 
> conversion_info *info)
>      inform (loc, "  no known conversion from %qH to %qI",
>             from, info->to_type);
>    else
> -    inform (loc, "  no known conversion for argument %d from %qH to %qI",
> -           info->n_arg + 1, from, info->to_type);
> +    {
> +      if (TREE_CODE (fn) == FUNCTION_DECL)
> +       loc = get_fndecl_argument_location (fn, info->n_arg);
> +      inform (loc, "  no known conversion for argument %d from %qH to %qI",
> +             info->n_arg + 1, from, info->to_type);
> +    }
>  }
>
>  /* Print information about a candidate with WANT parameters and we found
> @@ -3542,10 +3547,10 @@ print_z_candidate (location_t loc, const char *msgstr,
>                                    r->u.arity.expected);
>           break;
>         case rr_arg_conversion:
> -         print_conversion_rejection (cloc, &r->u.conversion);
> +         print_conversion_rejection (cloc, &r->u.conversion, fn);
>           break;
>         case rr_bad_arg_conversion:
> -         print_conversion_rejection (cloc, &r->u.bad_conversion);
> +         print_conversion_rejection (cloc, &r->u.bad_conversion, fn);
>           break;
>         case rr_explicit_conversion:
>           inform (cloc, "  return type %qT of explicit conversion function "
> diff --git a/gcc/testsuite/g++.dg/diagnostic/param-type-mismatch-2.C 
> b/gcc/testsuite/g++.dg/diagnostic/param-type-mismatch-2.C
> index 8cf2dab..4957f61 100644
> --- a/gcc/testsuite/g++.dg/diagnostic/param-type-mismatch-2.C
> +++ b/gcc/testsuite/g++.dg/diagnostic/param-type-mismatch-2.C
> @@ -82,7 +82,10 @@ int test_4 (int first, const char *second, float third)
>                          ^~~~~~~~
>       { dg-end-multiline-output "" } */
>    // { dg-message "no known conversion for argument 2 from 'const char\\*' 
> to 'const char\\*\\*'" "" { target *-*-* } s4_member_1 }
> -  // TODO: underline the pertinent param
> +  /* { dg-begin-multiline-output "" }
> + struct s4 { static int member_1 (int one, const char **two, float three); };
> +                                           ~~~~~~~~~~~~~^~~
> +     { dg-end-multiline-output "" } */
>  }
>
>  /* non-static member, with argname.  */
> @@ -103,7 +106,10 @@ int test_5 (int first, const char *second, float third)
>                   ^~~~~~~~
>       { dg-end-multiline-output "" } */
>    // { dg-message "no known conversion for argument 2 from 'const char\\*' 
> to 'const char\\*\\*'" "" { target *-*-* } s5_member_1 }
> -  // TODO: underline the pertinent param
> +  /* { dg-begin-multiline-output "" }
> + struct s5 { int member_1 (int one, const char **two, float three); };
> +                                    ~~~~~~~~~~~~~^~~
> +     { dg-end-multiline-output "" } */
>  }
>
>  /* non-static member, with argname, via a ptr.  */
> @@ -123,7 +129,10 @@ int test_6 (int first, const char *second, float third, 
> s6 *ptr)
>                   ^~~~~~~~
>       { dg-end-multiline-output "" } */
>    // { dg-message "no known conversion for argument 2 from 'const char\\*' 
> to 'const char\\*\\*'" "" { target *-*-* } s6_member_1 }
> -  // TODO: underline the pertinent param
> +  /* { dg-begin-multiline-output "" }
> + struct s6 { int member_1 (int one, const char **two, float three); };
> +                                    ~~~~~~~~~~~~~^~~
> +     { dg-end-multiline-output "" } */
>  }
>
>  /* Template function.  */
> @@ -170,7 +179,10 @@ int test_8 (int first, const char *second, float third)
>                          ^~~~~~~~
>       { dg-end-multiline-output "" } */
>    // { dg-message "no known conversion for argument 2 from 'const char\\*' 
> to 'const char\\*\\*'" "" { target *-*-* } s8_member_1 }
> -  // TODO: underline the pertinent param
> +  /* { dg-begin-multiline-output "" }
> + struct s8 { static int member_1 (int one, T two, float three); };
> +                                           ~~^~~
> +     { dg-end-multiline-output "" } */
>  }
>
>  /* Template class, non-static function.  */
> @@ -192,5 +204,8 @@ int test_9 (int first, const char *second, float third)
>                   ^~~~~~~~
>       { dg-end-multiline-output "" } */
>    // { dg-message "no known conversion for argument 2 from 'const char\\*' 
> to 'const char\\*\\*'" "" { target *-*-* } s9_member_1 }
> -  // TODO: underline the pertinent param
> +  /* { dg-begin-multiline-output "" }
> + struct s9 { int member_1 (int one, T two, float three); };
> +                                    ~~^~~
> +     { dg-end-multiline-output "" } */
>  }
> --
> 1.8.5.3
>

Reply via email to