Commit 672c767b by David Malcolm Committed by David Malcolm

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
parent 5f302518
2018-04-10 David Malcolm <dmalcolm@redhat.com>
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 <jakub@redhat.com> 2018-04-10 Jakub Jelinek <jakub@redhat.com>
PR c++/85312 - P0962 cleanup PR c++/85312 - P0962 cleanup
......
...@@ -6595,7 +6595,7 @@ maybe_print_user_conv_context (conversion *convs) ...@@ -6595,7 +6595,7 @@ maybe_print_user_conv_context (conversion *convs)
ARGNUM is zero based, -1 indicates the `this' argument of a method. ARGNUM is zero based, -1 indicates the `this' argument of a method.
Return the location of the FNDECL itself if there are problems. */ Return the location of the FNDECL itself if there are problems. */
static location_t location_t
get_fndecl_argument_location (tree fndecl, int argnum) get_fndecl_argument_location (tree fndecl, int argnum)
{ {
int i; int i;
......
...@@ -5995,6 +5995,8 @@ extern bool can_convert_arg (tree, tree, tree, int, ...@@ -5995,6 +5995,8 @@ extern bool can_convert_arg (tree, tree, tree, int,
tsubst_flags_t); tsubst_flags_t);
extern bool can_convert_arg_bad (tree, tree, tree, int, extern bool can_convert_arg_bad (tree, tree, tree, int,
tsubst_flags_t); tsubst_flags_t);
extern location_t get_fndecl_argument_location (tree, int);
/* A class for recording information about access failures (e.g. private /* A class for recording information about access failures (e.g. private
fields), so that we can potentially supply a fix-it hint about fields), so that we can potentially supply a fix-it hint about
......
...@@ -8785,9 +8785,13 @@ convert_for_assignment (tree type, tree rhs, ...@@ -8785,9 +8785,13 @@ convert_for_assignment (tree type, tree rhs,
parmnum, complain, flags); parmnum, complain, flags);
} }
else if (fndecl) else if (fndecl)
error_at (EXPR_LOC_OR_LOC (rhs, input_location), {
"cannot convert %qH to %qI for argument %qP to %qD", error_at (EXPR_LOC_OR_LOC (rhs, input_location),
rhstype, type, parmnum, fndecl); "cannot convert %qH to %qI",
rhstype, type);
inform (get_fndecl_argument_location (fndecl, parmnum),
" initializing argument %P of %qD", parmnum, fndecl);
}
else else
switch (errtype) switch (errtype)
{ {
......
2018-04-10 David Malcolm <dmalcolm@redhat.com>
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 <jakub@redhat.com> 2018-04-10 Jakub Jelinek <jakub@redhat.com>
PR fortran/85313 PR fortran/85313
......
...@@ -40,7 +40,7 @@ foo () ...@@ -40,7 +40,7 @@ foo ()
D *d7 = new D { 9 }; // { dg-error "cannot convert \[^\n\r]* to 'D' in initialization" "" { target c++14_down } } 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 } } 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 } // { 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 } } 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 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 } } V v2 = { E { 12 } }; // { dg-error "cannot convert 'int' to 'E' in initialization" "" { target c++14_down } }
...@@ -106,7 +106,7 @@ foo2 () ...@@ -106,7 +106,7 @@ foo2 ()
D *d7 = new D { 9 }; // { dg-error "cannot convert \[^\n\r]* to 'D' in initialization" "" { target c++14_down } } 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 } } 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 } // { 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 } } 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 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 } } V v2 = { E { 12 } }; // { dg-error "cannot convert 'int' to 'E' in initialization" "" { target c++14_down } }
...@@ -174,7 +174,7 @@ foo3 () ...@@ -174,7 +174,7 @@ foo3 ()
K *d7 = new K { 9 }; // { dg-error "cannot convert \[^\n\r]* to 'D' in initialization" "" { target c++14_down } } 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 } } 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 } // { 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 } } 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 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 } } M v2 = { L { 12 } }; // { dg-error "cannot convert 'int' to 'E' in initialization" "" { target c++14_down } }
......
...@@ -11,7 +11,7 @@ int foo(t1 *); ...@@ -11,7 +11,7 @@ int foo(t1 *);
void test_1 () { void test_1 () {
t2 pos; 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. */ /* Exercise %T. */
......
...@@ -4,44 +4,59 @@ ...@@ -4,44 +4,59 @@
/* decl, with argname. */ /* 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) 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 "" } /* { dg-begin-multiline-output "" }
return callee_1 (first, second, third); return callee_1 (first, second, third);
^~~~~~ ^~~~~~
{ dg-end-multiline-output "" } */ { 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. */ /* 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) 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 "" } /* { dg-begin-multiline-output "" }
return callee_2 (first, second, third); return callee_2 (first, second, third);
^~~~~~ ^~~~~~
{ dg-end-multiline-output "" } */ { 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. */ /* 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); return callee_2 (one, two, three);
} }
int test_3 (int first, const char *second, float third) 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 "" } /* { dg-begin-multiline-output "" }
return callee_3 (first, second, third); return callee_3 (first, second, third);
^~~~~~ ^~~~~~
{ dg-end-multiline-output "" } */ { 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. */ /* static member, with argname. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment