On Wed, Oct 09, 2019 at 11:01:39AM +0100, Jonathan Wakely wrote:
> On 07/10/19 14:56 -0400, Jason Merrill wrote:
> > On 10/7/19 1:42 PM, Marek Polacek wrote:
> > > @@ -7401,8 +7432,20 @@ convert_like_real (conversion *convs, tree expr, 
> > > tree fn, int argnum,
> > >         error_at (loc, "cannot bind non-const lvalue reference of "
> > >                   "type %qH to an rvalue of type %qI", totype, extype);
> > >       else if (!reference_compatible_p (TREE_TYPE (totype), extype))
> > > -       error_at (loc, "binding reference of type %qH to %qI "
> > > -                 "discards qualifiers", totype, extype);
> > > +       {
> > > +         /* If we're converting from T[] to T[N], don't talk
> > > +            about discarding qualifiers.  (Converting from T[N] to
> > > +            T[] is allowed by P0388R4.)  */
> > > +         if (TREE_CODE (extype) == ARRAY_TYPE
> > > +             && TYPE_DOMAIN (extype) == NULL_TREE
> > > +             && TREE_CODE (TREE_TYPE (totype)) == ARRAY_TYPE
> > > +             && TYPE_DOMAIN (TREE_TYPE (totype)) != NULL_TREE)
> > > +           error_at (loc, "binding reference of type %qH to %qI "
> > > +                     "discards array bounds", totype, extype);
> > 
> > If we're converting to T[N], that would be adding, not discarding, array
> > bounds?
> 
> I don't think the diagnostic would be very good if we say "adds array
> bounds" though. How about being consistent with the existing error for
> similar cases?
> 
> a.cc:4:17: error: invalid initialization of reference of type ‘int (&)[3]’ 
> from expression of type ‘int []’
>   int (&b)[3] = a;
>                 ^

In my latest patch the error message reads "cannot bind reference of type T to 
U due to different array bounds".
It'd be trivial to adjust it if anyone hates that.

Marek

Reply via email to