[PATCH 2/2] Show pertinent parameter (PR c++/85110)

David Malcolm dmalcolm@redhat.com
Wed Mar 28 20:37:00 GMT 2018


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



More information about the Gcc-patches mailing list