On Tue, Sep 24, 2024 at 2:41 AM Richard Biener
<richard.guent...@gmail.com> wrote:
>
> On Mon, Sep 23, 2024 at 3:41 PM Jason Merrill <ja...@redhat.com> wrote:
> >
> > On 9/23/24 9:05 AM, Richard Biener wrote:
> > > On Sat, Sep 21, 2024 at 2:49 AM Jason Merrill <ja...@redhat.com> wrote:
> > >>
> > >> Tested x86_64-pc-linux-gnu.  OK for trunk?
> > >>
> > >> -- 8< --
> > >>
> > >> We've been using -Wno-narrowing since gcc 4.7, but at this point 
> > >> narrowing
> > >> diagnostics seem like a stable part of C++ and we should adjust.
> > >>
> > >> This patch changes -Wno-narrowing to -Wno-error=narrowing so that 
> > >> narrowing
> > >> issues will still not break bootstrap, but we can see them.
> > >>
> > >> The rest of the patch fixes the narrowing warnings I see in an
> > >> x86_64-pc-linux-gnu bootstrap.  In most of the cases, by adjusting the 
> > >> types
> > >> of various declarations so that we store the values in the same types we
> > >> compute them in, which seems worthwhile anyway.  This also allowed us to
> > >> remove a few -Wsign-compare casts.
> > >>
> > >> The one place I didn't see how best to do this was in
> > >> vect_prologue_cost_for_slp: changing const_nunits to unsigned int broke 
> > >> the
> > >> call to TYPE_VECTOR_SUBPARTS (vectype).is_constant (&const_nunits), since
> > >> poly_uint64.is_constant wants a pointer to unsigned HOST_WIDE_INT.  So I
> > >> added casts in that one place.  Not too bad, I think.
> > >>
> > >> +       unsigned HOST_WIDE_INT foff = bitpos_of_field (field);
> > >
> > > Can you make bitpos_of_field return unsigned HOST_WIDE_INT then and 
> > > adjust it
> > > accordingly - it looks for shwi fitting but negative DECL_FIELD_OFFSET
> > > or BIT_OFFSET are not a thing.
> >
> > So, like the attached?
> >
> > >> @@ -7471,7 +7471,8 @@ vect_prologue_cost_for_slp (slp_tree node,
> > >>         nelt_limit = const_nunits;
> > >>         hash_set<vect_scalar_ops_slice_hash> vector_ops;
> > >>         for (unsigned int i = 0; i < SLP_TREE_NUMBER_OF_VEC_STMTS 
> > >> (node); ++i)
> > >> -       if (!vector_ops.add ({ ops, i * const_nunits, const_nunits }))
> > >
> > > So why do we diagnose this case (unsigned int member) but not ...
> > >
> > >> +       if (!vector_ops.add
> > >> +           ({ ops, i * (unsigned)const_nunits, (unsigned)const_nunits 
> > >> }))
> > >>            starts.quick_push (i * const_nunits);
> > >
> > > ... this one - unsigned int function argument?
> >
> > Because the former is in { }, and the latter isn't; narrowing
> > conversions are only ill-formed within { }.
> >
> > > I think it would be slightly better to do
> > >
> > >          {
> > >             unsigned start = (unsigned) const_units * i;
> > >             if (!vector_ops.add ({ ops, start, const_unints }))
> > >               starts.quick_push (start);
> > >          }
> > >
> > > to avoid the non-obvious difference between both.
> >
> > We'd still need the cast for the third element, but now I notice we can
> > use nelt_limit instead since it just got the same value.
> >
> > So, OK with this supplemental patch?
>
> OK.
>
> Thanks,
> Richard.

Note that libcpp uses -Wno-narrowing, too; perhaps it's worth making
this change there, as well?

Reply via email to