This followup patch updates the specific error-handling path to add a note showing the pertinent parameter decl, taking the output from:
test.cc: In function 'void caller(const char*)': test.cc:6:14: error: cannot convert 'const char*' to 'const char**' for argument '2' to 'void callee(int, const char**, int)' callee (1, fmt, 3); ^~~ to: test.cc: In function 'void caller(const char*)': test.cc:6:14: error: cannot convert 'const char*' to 'const char**' for argument '2' to 'void callee(int, const char**, int)' callee (1, fmt, 3); ^~~ test.cc:1:36: note: initializing argument 2 of 'void callee(int, const char**, int)' void callee (int one, const char **two, int three); ~~~~~~~~~~~~~^~~ Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu; adds a further 18 PASS results to g++.sum. Again, not a regression as such, but I've been calling out the underlined arguments as a feature of gcc 8, so would be good to fix. OK for trunk? gcc/cp/ChangeLog: PR c++/85110 * call.c (get_fndecl_argument_location): Make non-static. * cp-tree.h (get_fndecl_argument_location): New decl. * typeck.c (convert_for_assignment): When complaining due to conversions for an argument, show the location of the parameter within the decl. gcc/testsuite/ChangeLog: PR c++/85110 * g++.dg/diagnostic/param-type-mismatch-2.C: Update for the cases where we now show the pertinent parameter. --- gcc/cp/call.c | 2 +- gcc/cp/cp-tree.h | 2 ++ gcc/cp/typeck.c | 10 +++++++--- .../g++.dg/diagnostic/param-type-mismatch-2.C | 21 ++++++++++++++++++--- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 1a87f99..e1a0639 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -6598,7 +6598,7 @@ maybe_print_user_conv_context (conversion *convs) ARGNUM is zero based, -1 indicates the `this' argument of a method. Return the location of the FNDECL itself if there are problems. */ -static location_t +location_t get_fndecl_argument_location (tree fndecl, int argnum) { int i; diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index d5382c2..b45880d 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5965,6 +5965,8 @@ extern bool can_convert_arg (tree, tree, tree, int, tsubst_flags_t); extern bool can_convert_arg_bad (tree, tree, tree, int, tsubst_flags_t); +extern location_t get_fndecl_argument_location (tree, int); + /* A class for recording information about access failures (e.g. private fields), so that we can potentially supply a fix-it hint about diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index e733c79..742b2e9 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -8781,9 +8781,13 @@ convert_for_assignment (tree type, tree rhs, parmnum, complain, flags); } else if (fndecl) - error_at (EXPR_LOC_OR_LOC (rhs, input_location), - "cannot convert %qH to %qI for argument %qP to %qD", - rhstype, type, parmnum, fndecl); + { + error_at (EXPR_LOC_OR_LOC (rhs, input_location), + "cannot convert %qH to %qI for argument %qP to %qD", + rhstype, type, parmnum, fndecl); + inform (get_fndecl_argument_location (fndecl, parmnum), + " initializing argument %P of %qD", parmnum, fndecl); + } else switch (errtype) { 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 ae84248..39497a5 100644 --- a/gcc/testsuite/g++.dg/diagnostic/param-type-mismatch-2.C +++ b/gcc/testsuite/g++.dg/diagnostic/param-type-mismatch-2.C @@ -4,7 +4,7 @@ /* decl, with argname. */ -extern int callee_1 (int one, const char **two, float three); +extern int callee_1 (int one, const char **two, float three); // { dg-line callee_1 } int test_1 (int first, const char *second, float third) { @@ -13,11 +13,16 @@ int test_1 (int first, const char *second, float third) return callee_1 (first, second, third); ^~~~~~ { dg-end-multiline-output "" } */ + // { dg-message "initializing argument 2 of 'int callee_1\\(int, const char\\*\\*, float\\)'" "" { target *-*-* } callee_1 } + /* { dg-begin-multiline-output "" } + extern int callee_1 (int one, const char **two, float three); + ~~~~~~~~~~~~~^~~ + { dg-end-multiline-output "" } */ } /* decl, without argname. */ -extern int callee_2 (int, const char **, float); +extern int callee_2 (int, const char **, float); // { dg-line callee_2 } int test_2 (int first, const char *second, float third) { @@ -26,11 +31,16 @@ int test_2 (int first, const char *second, float third) return callee_2 (first, second, third); ^~~~~~ { dg-end-multiline-output "" } */ + // { dg-message "initializing argument 2 of 'int callee_2\\(int, const char\\*\\*, float\\)'" "" { target *-*-* } callee_2 } + /* { dg-begin-multiline-output "" } + extern int callee_2 (int, const char **, float); + ^~~~~~~~~~~~~ + { dg-end-multiline-output "" } */ } /* defn, with argname. */ -static int callee_3 (int one, const char **two, float three) +static int callee_3 (int one, const char **two, float three) // { dg-line callee_3 } { return callee_2 (one, two, three); } @@ -42,6 +52,11 @@ int test_3 (int first, const char *second, float third) return callee_3 (first, second, third); ^~~~~~ { dg-end-multiline-output "" } */ + // { dg-message "initializing argument 2 of 'int callee_3\\(int, const char\\*\\*, float\\)'" "" { target *-*-* } callee_3 } + /* { dg-begin-multiline-output "" } + static int callee_3 (int one, const char **two, float three) + ~~~~~~~~~~~~~^~~ + { dg-end-multiline-output "" } */ } /* static member, with argname. */ -- 1.8.5.3