Show pertinent parameter (PR c++/85110)
authorDavid Malcolm <dmalcolm@redhat.com>
Tue, 10 Apr 2018 14:37:09 +0000 (14:37 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Tue, 10 Apr 2018 14:37:09 +0000 (14:37 +0000)
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
gcc/cp/call.c
gcc/cp/cp-tree.h
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp1z/direct-enum-init1.C
gcc/testsuite/g++.dg/diagnostic/aka2.C
gcc/testsuite/g++.dg/diagnostic/param-type-mismatch-2.C

index eeb1b2a..b6e7ee4 100644 (file)
@@ -1,3 +1,12 @@
+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>
 
        PR c++/85312 - P0962 cleanup
index 94226d6..9ecb91d 100644 (file)
@@ -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;
index 204791e..7d3e017 100644 (file)
@@ -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
index e5ad54d..b449b1f 100644 (file)
@@ -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)
                  {
index 302fd98..7bd4b1d 100644 (file)
@@ -1,3 +1,11 @@
+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>
 
        PR fortran/85313
index d8cffb4..fa2934e 100644 (file)
@@ -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 } }
index a43f9e3..d7a3b35 100644 (file)
@@ -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.  */
index ae84248..c3b6f00 100644 (file)
@@ -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.  */