On Wed, 12 Feb 2020 at 21:06, Marek Polacek <pola...@redhat.com> wrote:
>
> A small improvement for an error in build_user_type_conversion_1:
> instead of
>
> array-init1.C:11:1: error: conversion from ‘long int’ to ‘A’ is ambiguous
>    11 | };
>       | ^
>
> we will print
>
> array-init1.C:8:3: error: conversion from ‘long int’ to ‘A’ is ambiguous
>     8 |   0L,
>       |   ^~
>
> Bootstrapped/regtested on x86_64-linux, ok for trunk?
>
> 2020-02-12  Marek Polacek  <pola...@redhat.com>
>
>         PR c++/93710 - poor diagnostic for array initializer.
>         * call.c (build_user_type_conversion_1): Use cp_expr_loc_or_input_loc
>         for an error call.
>
>         * g++.dg/diagnostic/array-init1.C: New test.
> ---
>  gcc/cp/call.c                                 |  5 +++--
>  gcc/testsuite/g++.dg/diagnostic/array-init1.C | 11 +++++++++++
>  2 files changed, 14 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/testsuite/g++.dg/diagnostic/array-init1.C
>
> diff --git a/gcc/cp/call.c b/gcc/cp/call.c
> index 51621b7dd87..f47f96bf1c2 100644
> --- a/gcc/cp/call.c
> +++ b/gcc/cp/call.c
> @@ -4172,8 +4172,9 @@ build_user_type_conversion_1 (tree totype, tree expr, 
> int flags,
>        if (complain & tf_error)
>         {
>           auto_diagnostic_group d;
> -         error ("conversion from %qH to %qI is ambiguous",
> -                fromtype, totype);
> +         error_at (cp_expr_loc_or_input_loc (expr),
> +                   "conversion from %qH to %qI is ambiguous",
> +                   fromtype, totype);
>           print_z_candidates (location_of (expr), candidates);
>         }
>
> diff --git a/gcc/testsuite/g++.dg/diagnostic/array-init1.C 
> b/gcc/testsuite/g++.dg/diagnostic/array-init1.C
> new file mode 100644
> index 00000000000..78580ad6b83
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/diagnostic/array-init1.C
> @@ -0,0 +1,11 @@
> +// PR c++/93710 - poor diagnostic for array initializer.
> +
> +struct A { A (int); A (char*); int i; };
> +
> +int x;
> +
> +A a1[] = {
> +  0L, // { dg-error "3:conversion from .long int. to .A. is ambiguous" }
> +  &x, // { dg-error "3:invalid conversion from .int\\*. to .int." }
> +  __builtin_offsetof (A, i) // { dg-error "23:conversion from .long unsigned 
> int. to .A. is ambiguous" }

Hi,

This test fails on arm (and i586 according to gcc-testresults:
/gcc/testsuite/g++.dg/diagnostic/array-init1.C:10:23: error:
conversion from 'unsigned int' to 'A' is ambiguous

Note sure if you want to make the dg-error conditional or match '.*
unsigned int' ?

Christophe

> +};
>
> base-commit: 5bfc8303ffe2d86e938d45f13cd99a39469dac4f
> --
> Marek Polacek • Red Hat, Inc. • 300 A St, Boston, MA
>

Reply via email to