aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2018-08-29 13:52:22 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2018-08-29 13:52:22 +0000
commit66e5825973556c8db6fc2cf19179397506b0b101 (patch)
tree7f847135e0fc41b9b41c03c8fb0ba341eaa03b5b /gcc
parent1ca7a4d457a6d4769f3e6fa9f880e58a7a2eb8c8 (diff)
downloadgcc-66e5825973556c8db6fc2cf19179397506b0b101.zip
gcc-66e5825973556c8db6fc2cf19179397506b0b101.tar.gz
gcc-66e5825973556c8db6fc2cf19179397506b0b101.tar.bz2
C++: underline param in print_conversion_rejection (more PR c++/85110)
Consider this bogus code (from g++.dg/diagnostic/param-type-mismatch-2.C): struct s4 { static int member_1 (int one, const char **two, float three); }; int test_4 (int first, const char *second, float third) { return s4::member_1 (first, second, third); } Before this patch, g++ emits: demo.cc: In function 'int test_4(int, const char*, float)': demo.cc:5:44: error: no matching function for call to 's4::member_1(int&, const char*&, float&)' 5 | return s4::member_1 (first, second, third); | ^ demo.cc:1:24: note: candidate: 'static int s4::member_1(int, const char**, float)' 1 | struct s4 { static int member_1 (int one, const char **two, float three); }; | ^~~~~~~~ demo.cc:1:24: note: no known conversion for argument 2 from 'const char*' to 'const char**' With this patch, it highlights the pertinent parameter in the "no known conversion" note: demo.cc: In function 'int test_4(int, const char*, float)': demo.cc:5:44: error: no matching function for call to 's4::member_1(int&, const char*&, float&)' 5 | return s4::member_1 (first, second, third); | ^ demo.cc:1:24: note: candidate: 'static int s4::member_1(int, const char**, float)' 1 | struct s4 { static int member_1 (int one, const char **two, float three); }; | ^~~~~~~~ demo.cc:1:56: note: no known conversion for argument 2 from 'const char*' to 'const char**' 1 | struct s4 { static int member_1 (int one, const char **two, float three); }; | ~~~~~~~~~~~~~^~~ gcc/cp/ChangeLog: PR c++/85110 * call.c (print_conversion_rejection): Add "fn" param and use it for "no known conversion" messages to underline the pertinent param. (print_z_candidate): Supply "fn" to the new param above. gcc/testsuite/ChangeLog: PR c++/85110 * g++.dg/diagnostic/param-type-mismatch-2.C: Update expected output to reflect underlining of pertinent parameter in decl for "no known conversion" messages. From-SVN: r263957
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/call.c17
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/diagnostic/param-type-mismatch-2.C25
4 files changed, 46 insertions, 11 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 5747957..0719186 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2018-08-29 David Malcolm <dmalcolm@redhat.com>
+
+ PR c++/85110
+ * call.c (print_conversion_rejection): Add "fn" param and use it
+ for "no known conversion" messages to underline the pertinent
+ param.
+ (print_z_candidate): Supply "fn" to the new param above.
+
2018-08-29 Jakub Jelinek <jakub@redhat.com>
PR c++/87122
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 1001be2..a156702 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -3432,10 +3432,11 @@ equal_functions (tree fn1, tree fn2)
return fn1 == fn2;
}
-/* Print information about a candidate being rejected due to INFO. */
+/* Print information about a candidate FN being rejected due to INFO. */
static void
-print_conversion_rejection (location_t loc, struct conversion_info *info)
+print_conversion_rejection (location_t loc, struct conversion_info *info,
+ tree fn)
{
tree from = info->from;
if (!TYPE_P (from))
@@ -3466,8 +3467,12 @@ print_conversion_rejection (location_t loc, struct conversion_info *info)
inform (loc, " no known conversion from %qH to %qI",
from, info->to_type);
else
- inform (loc, " no known conversion for argument %d from %qH to %qI",
- info->n_arg + 1, from, info->to_type);
+ {
+ if (TREE_CODE (fn) == FUNCTION_DECL)
+ loc = get_fndecl_argument_location (fn, info->n_arg);
+ inform (loc, " no known conversion for argument %d from %qH to %qI",
+ info->n_arg + 1, from, info->to_type);
+ }
}
/* Print information about a candidate with WANT parameters and we found
@@ -3542,10 +3547,10 @@ print_z_candidate (location_t loc, const char *msgstr,
r->u.arity.expected);
break;
case rr_arg_conversion:
- print_conversion_rejection (cloc, &r->u.conversion);
+ print_conversion_rejection (cloc, &r->u.conversion, fn);
break;
case rr_bad_arg_conversion:
- print_conversion_rejection (cloc, &r->u.bad_conversion);
+ print_conversion_rejection (cloc, &r->u.bad_conversion, fn);
break;
case rr_explicit_conversion:
inform (cloc, " return type %qT of explicit conversion function "
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 17ea5c7..ebdfcf5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2018-08-29 David Malcolm <dmalcolm@redhat.com>
+
+ PR c++/85110
+ * g++.dg/diagnostic/param-type-mismatch-2.C: Update expected
+ output to reflect underlining of pertinent parameter in decl
+ for "no known conversion" messages.
+
2018-08-29 Jakub Jelinek <jakub@redhat.com>
PR c++/87122
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 8cf2dab..4957f61 100644
--- a/gcc/testsuite/g++.dg/diagnostic/param-type-mismatch-2.C
+++ b/gcc/testsuite/g++.dg/diagnostic/param-type-mismatch-2.C
@@ -82,7 +82,10 @@ int test_4 (int first, const char *second, float third)
^~~~~~~~
{ dg-end-multiline-output "" } */
// { dg-message "no known conversion for argument 2 from 'const char\\*' to 'const char\\*\\*'" "" { target *-*-* } s4_member_1 }
- // TODO: underline the pertinent param
+ /* { dg-begin-multiline-output "" }
+ struct s4 { static int member_1 (int one, const char **two, float three); };
+ ~~~~~~~~~~~~~^~~
+ { dg-end-multiline-output "" } */
}
/* non-static member, with argname. */
@@ -103,7 +106,10 @@ int test_5 (int first, const char *second, float third)
^~~~~~~~
{ dg-end-multiline-output "" } */
// { dg-message "no known conversion for argument 2 from 'const char\\*' to 'const char\\*\\*'" "" { target *-*-* } s5_member_1 }
- // TODO: underline the pertinent param
+ /* { dg-begin-multiline-output "" }
+ struct s5 { int member_1 (int one, const char **two, float three); };
+ ~~~~~~~~~~~~~^~~
+ { dg-end-multiline-output "" } */
}
/* non-static member, with argname, via a ptr. */
@@ -123,7 +129,10 @@ int test_6 (int first, const char *second, float third, s6 *ptr)
^~~~~~~~
{ dg-end-multiline-output "" } */
// { dg-message "no known conversion for argument 2 from 'const char\\*' to 'const char\\*\\*'" "" { target *-*-* } s6_member_1 }
- // TODO: underline the pertinent param
+ /* { dg-begin-multiline-output "" }
+ struct s6 { int member_1 (int one, const char **two, float three); };
+ ~~~~~~~~~~~~~^~~
+ { dg-end-multiline-output "" } */
}
/* Template function. */
@@ -170,7 +179,10 @@ int test_8 (int first, const char *second, float third)
^~~~~~~~
{ dg-end-multiline-output "" } */
// { dg-message "no known conversion for argument 2 from 'const char\\*' to 'const char\\*\\*'" "" { target *-*-* } s8_member_1 }
- // TODO: underline the pertinent param
+ /* { dg-begin-multiline-output "" }
+ struct s8 { static int member_1 (int one, T two, float three); };
+ ~~^~~
+ { dg-end-multiline-output "" } */
}
/* Template class, non-static function. */
@@ -192,5 +204,8 @@ int test_9 (int first, const char *second, float third)
^~~~~~~~
{ dg-end-multiline-output "" } */
// { dg-message "no known conversion for argument 2 from 'const char\\*' to 'const char\\*\\*'" "" { target *-*-* } s9_member_1 }
- // TODO: underline the pertinent param
+ /* { dg-begin-multiline-output "" }
+ struct s9 { int member_1 (int one, T two, float three); };
+ ~~^~~
+ { dg-end-multiline-output "" } */
}