[PATCH] c++: Fix poor diagnostic for array initializer [PR93710]
Marek Polacek
polacek@redhat.com
Tue Feb 18 21:20:00 GMT 2020
On Mon, Feb 17, 2020 at 02:11:59PM +0100, Christophe Lyon wrote:
> On Wed, 12 Feb 2020 at 21:06, Marek Polacek <polacek@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 <polacek@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' ?
Sorry about that, fixed now.
Marek
More information about the Gcc-patches
mailing list