From 672c767bf6dfbebc22062403e9e8cfc0f6e290ac Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Tue, 10 Apr 2018 14:37:09 +0000 Subject: [PATCH] Show pertinent parameter (PR c++/85110) 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/cpp1z/direct-enum-init1.C: Update for the cases where we now show the pertinent parameter. * g++.dg/diagnostic/aka2.C: Likewise. * g++.dg/diagnostic/param-type-mismatch-2.C: Likewise. From-SVN: r259282 --- gcc/cp/ChangeLog | 9 +++++++ gcc/cp/call.c | 2 +- gcc/cp/cp-tree.h | 2 ++ gcc/cp/typeck.c | 10 ++++--- gcc/testsuite/ChangeLog | 8 ++++++ .../g++.dg/cpp1z/direct-enum-init1.C | 6 ++--- gcc/testsuite/g++.dg/diagnostic/aka2.C | 2 +- .../g++.dg/diagnostic/param-type-mismatch-2.C | 27 ++++++++++++++----- 8 files changed, 52 insertions(+), 14 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index eeb1b2a9a21..b6e7ee481cd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2018-04-10 David Malcolm + + 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. + 2018-04-10 Jakub Jelinek PR c++/85312 - P0962 cleanup diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 94226d6ea71..9ecb91dc1b5 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -6595,7 +6595,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 204791e51cf..7d3e0174535 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5995,6 +5995,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 e5ad54dbcd1..b449b1f7f53 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -8785,9 +8785,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", + rhstype, type); + inform (get_fndecl_argument_location (fndecl, parmnum), + " initializing argument %P of %qD", parmnum, fndecl); + } else switch (errtype) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 302fd9845fc..7bd4b1d4fb4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2018-04-10 David Malcolm + + PR c++/85110 + * g++.dg/cpp1z/direct-enum-init1.C: Update for the cases + where we now show the pertinent parameter. + * g++.dg/diagnostic/aka2.C: Likewise. + * g++.dg/diagnostic/param-type-mismatch-2.C: Likewise. + 2018-04-10 Jakub Jelinek PR fortran/85313 diff --git a/gcc/testsuite/g++.dg/cpp1z/direct-enum-init1.C b/gcc/testsuite/g++.dg/cpp1z/direct-enum-init1.C index d8cffb4135a..fa2934e2371 100644 --- a/gcc/testsuite/g++.dg/cpp1z/direct-enum-init1.C +++ b/gcc/testsuite/g++.dg/cpp1z/direct-enum-init1.C @@ -40,7 +40,7 @@ foo () D *d7 = new D { 9 }; // { dg-error "cannot convert \[^\n\r]* to 'D' in initialization" "" { target c++14_down } } E *e5 = new E { -4 }; // { dg-error "cannot convert \[^\n\r]* to 'E' in initialization" "" { target c++14_down } } // { dg-error "narrowing conversion of '-4' from 'int' to 'unsigned char' inside" "" { target c++17 } .-1 } - bar ({ 10 }); // { dg-error "cannot convert \[^\n\r]* to 'E' for argument" } + bar ({ 10 }); // { dg-error "cannot convert \[^\n\r]* to 'E'" } bar (E { 9 }); // { dg-error "cannot convert 'int' to 'E' in initialization" "" { target c++14_down } } V v1 = { { 11 } }; // { dg-error "braces around scalar initializer for type 'E'" } V v2 = { E { 12 } }; // { dg-error "cannot convert 'int' to 'E' in initialization" "" { target c++14_down } } @@ -106,7 +106,7 @@ foo2 () D *d7 = new D { 9 }; // { dg-error "cannot convert \[^\n\r]* to 'D' in initialization" "" { target c++14_down } } E *e5 = new E { -4 }; // { dg-error "cannot convert \[^\n\r]* to 'E' in initialization" "" { target c++14_down } } // { dg-error "narrowing conversion of '-4' from 'int' to 'unsigned char' inside" "" { target c++17 } .-1 } - bar ({ 10 }); // { dg-error "cannot convert \[^\n\r]* to 'E' for argument" } + bar ({ 10 }); // { dg-error "cannot convert \[^\n\r]* to 'E'" } bar (E { 9 }); // { dg-error "cannot convert 'int' to 'E' in initialization" "" { target c++14_down } } V v1 = { { 11 } }; // { dg-error "braces around scalar initializer for type 'E'" } V v2 = { E { 12 } }; // { dg-error "cannot convert 'int' to 'E' in initialization" "" { target c++14_down } } @@ -174,7 +174,7 @@ foo3 () K *d7 = new K { 9 }; // { dg-error "cannot convert \[^\n\r]* to 'D' in initialization" "" { target c++14_down } } L *e5 = new L { -4 }; // { dg-error "cannot convert \[^\n\r]* to 'E' in initialization" "" { target c++14_down } } // { dg-error "narrowing conversion of '-4' from 'int' to 'unsigned char' inside" "" { target c++17 } .-1 } - bar3 ({ 10 }); // { dg-error "cannot convert \[^\n\r]* to 'E' for argument" } + bar3 ({ 10 }); // { dg-error "cannot convert \[^\n\r]* to 'E'" } bar3 (E { 9 }); // { dg-error "cannot convert 'int' to 'E' in initialization" "" { target c++14_down } } M v1 = { { 11 } }; // { dg-error "braces around scalar initializer for type 'E'" } M v2 = { L { 12 } }; // { dg-error "cannot convert 'int' to 'E' in initialization" "" { target c++14_down } } diff --git a/gcc/testsuite/g++.dg/diagnostic/aka2.C b/gcc/testsuite/g++.dg/diagnostic/aka2.C index a43f9e30a88..d7a3b3522cd 100644 --- a/gcc/testsuite/g++.dg/diagnostic/aka2.C +++ b/gcc/testsuite/g++.dg/diagnostic/aka2.C @@ -11,7 +11,7 @@ int foo(t1 *); void test_1 () { t2 pos; - foo (&pos); // { dg-error "cannot convert 't2\\*' {aka 's2\\*'} to 't1\\*' {aka 's1\\*'} for argument '1' to 'int foo\\(t1\\*\\)'" } + foo (&pos); // { dg-error "cannot convert 't2\\*' {aka 's2\\*'} to 't1\\*' {aka 's1\\*'}" } } /* Exercise %T. */ 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 ae84248b417..c3b6f003b3e 100644 --- a/gcc/testsuite/g++.dg/diagnostic/param-type-mismatch-2.C +++ b/gcc/testsuite/g++.dg/diagnostic/param-type-mismatch-2.C @@ -4,44 +4,59 @@ /* 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) { - return callee_1 (first, second, third); // { dg-error "27: cannot convert 'const char\\*' to 'const char\\*\\*' for argument '2' to 'int callee_1\\(int, const char\\*\\*, float\\)'" } + return callee_1 (first, second, third); // { dg-error "27: cannot convert 'const char\\*' to 'const char\\*\\*'" } /* { dg-begin-multiline-output "" } 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) { - return callee_2 (first, second, third); // { dg-error "27: cannot convert 'const char\\*' to 'const char\\*\\*' for argument '2' to 'int callee_2\\(int, const char\\*\\*, float\\)'" } + return callee_2 (first, second, third); // { dg-error "27: cannot convert 'const char\\*' to 'const char\\*\\*'" } /* { dg-begin-multiline-output "" } 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); } int test_3 (int first, const char *second, float third) { - return callee_3 (first, second, third); // { dg-error "27: cannot convert 'const char\\*' to 'const char\\*\\*' for argument '2' to 'int callee_3\\(int, const char\\*\\*, float\\)'" } + return callee_3 (first, second, third); // { dg-error "27: cannot convert 'const char\\*' to 'const char\\*\\*'" } /* { dg-begin-multiline-output "" } 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. */ -- 2.30.2