[Bug c++/85110] Missing underlines for some bad arguments

dmalcolm at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Sep 12 18:54:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85110

--- Comment #8 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
Author: dmalcolm
Date: Wed Sep 12 18:50:08 2018
New Revision: 264250

URL: https://gcc.gnu.org/viewcvs?rev=264250&root=gcc&view=rev
Log:
C++: special-case single non-viable candidate (more PR c++/85110)

I broke out the "no viable candidates" case in build_new_method_call_1
into a subroutine, and added special-case handling for when there's
a single non-viable candidate where there's an argument conversion
error.  I turned the error-handling from convert_for_assignment into
a subroutine, calling it from this new special-case.

This converts:

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);
};
  |                                           ~~~~~~~~~~~~~^~~

to:

demo.cc: In function 'int test_4(int, const char*, float)':
demo.cc:5:31: error: cannot convert 'const char*' to 'const char**'
5 |   return s4::member_1 (first, second, third);
  |                               ^~~~~~
  |                               |
  |                               const char*
demo.cc:1:56: note:   initializing argument 2 of 'static int s4::member_1(int,
const char**, float)'
1 | struct s4 { static int member_1 (int one, const char **two, float three);
};
  |                                           ~~~~~~~~~~~~~^~~

thus highlighting the problematic argument at the callsite (and its type).

gcc/cp/ChangeLog:
        PR c++/85110
        * call.c (struct conversion_info): Add "loc" field.
        (arg_conversion_rejection): Add "loc" param, using it to
        initialize the new field.
        (bad_arg_conversion_rejection): Likewise.
        (explicit_conversion_rejection): Initialize the new field to
        UNKNOWN_LOCATION.
        (template_conversion_rejection): Likewise.
        (add_function_candidate): Pass on the argument location to the new
        param of arg_conversion_rejection.
        (add_conv_candidate): Likewise.
        (build_builtin_candidate): Likewise.
        (build_user_type_conversion_1): Likewise.
        (single_z_candidate): New function.
        (maybe_get_bad_conversion_for_unmatched_call): New function.
        (complain_about_bad_argument): New function, based on part of
        convert_for_assignment.
        (build_new_method_call_1): Split out handling of the "no viable
        candidates" case into...
        (complain_about_no_candidates_for_method_call): ...this new
        function, and use the new functions above to special-case the
        handling of a single non-viable candidate due to a bad argument.
        * cp-tree.h (complain_about_bad_argument): New decl.
        * typeck.c (convert_for_assignment): Split out one error-handling
        case into complain_about_bad_argument.

gcc/testsuite/ChangeLog:
        PR c++/85110
        * g++.dg/cpp0x/explicit4.C: Update expected output to reflect
        special-casing of diagnostic for a single non-viable candidate due
        to a bad argument.
        * g++.dg/diagnostic/param-type-mismatch-2.C: Likewise.
        Add test coverage for an unmatched overloaded operator.
        * g++.dg/expr/pmf-1.C: Likewise.
        * g++.old-deja/g++.bugs/900330_02.C: Likewise.
        * g++.old-deja/g++.jason/conversion11.C: Likewise.
        * g++.old-deja/g++.law/arg11.C: Likewise.
        * g++.old-deja/g++.law/arm9.C: Likewise.
        * g++.old-deja/g++.robertl/eb131.C: Likewise.


Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/call.c
    trunk/gcc/cp/cp-tree.h
    trunk/gcc/cp/typeck.c
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/g++.dg/cpp0x/explicit4.C
    trunk/gcc/testsuite/g++.dg/diagnostic/param-type-mismatch-2.C
    trunk/gcc/testsuite/g++.dg/expr/pmf-1.C
    trunk/gcc/testsuite/g++.old-deja/g++.bugs/900330_02.C
    trunk/gcc/testsuite/g++.old-deja/g++.jason/conversion11.C
    trunk/gcc/testsuite/g++.old-deja/g++.law/arg11.C
    trunk/gcc/testsuite/g++.old-deja/g++.law/arm9.C
    trunk/gcc/testsuite/g++.old-deja/g++.robertl/eb131.C


More information about the Gcc-bugs mailing list