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.
>
> gcc/ChangeLog:
>
>         * configure.ac (CXX_WARNING_OPTS): Change -Wno-narrowing
>         to -Wno-error=narrowing.
>         * configure: Regenerate.
>         * config/i386/i386.h (debugger_register_map)
>         (debugger64_register_map)
>         (svr4_debugger_register_map): Make unsigned.
>         * config/i386/i386.cc: Likewise.
>         * diagnostic-event-id.h (diagnostic_thread_id_t): Make int.
>         * vec.h (vec::size): Make unsigned int.
>         * ipa-modref.cc (escape_point::arg): Make unsigned.
>         (modref_lattice::add_escape_point): Use eaf_flags_t.
>         (update_escape_summary_1): Use eaf_flags_t, && for bool.
>         * pair-fusion.cc (pair_fusion_bb_info::track_access):
>         Make mem_size unsigned int.
>         * pretty-print.cc (format_phase_2): Cast va_arg to char.
>         * tree-ssa-loop-ch.cc (ch_base::copy_headers): Make nheaders
>         unsigned, remove cast.
>         * tree-ssa-structalias.cc (push_fields_onto_fieldstack):
>         Make offset unsigned, remove cast.
>         * tree-vect-slp.cc (vect_prologue_cost_for_slp): Add cast.
>         * tree-vect-stmts.cc (vect_truncate_gather_scatter_offset):
>         Make scale unsigned.
>         (vectorizable_operation): Make ncopies unsigned.
>         * rtl-ssa/member-fns.inl: Make num_accesses unsigned int.
> ---
>  gcc/config/i386/i386.h      |  6 +++---
>  gcc/diagnostic-event-id.h   |  2 +-
>  gcc/vec.h                   |  2 +-
>  gcc/config/i386/i386.cc     |  6 +++---
>  gcc/ipa-modref.cc           | 13 +++++++------
>  gcc/pair-fusion.cc          |  2 +-
>  gcc/pretty-print.cc         |  2 +-
>  gcc/tree-ssa-loop-ch.cc     |  6 +++---
>  gcc/tree-ssa-structalias.cc |  6 +++---
>  gcc/tree-vect-slp.cc        |  3 ++-
>  gcc/tree-vect-stmts.cc      |  7 ++++---
>  gcc/configure.ac            |  3 +--
>  gcc/rtl-ssa/member-fns.inl  |  3 ++-
>  gcc/configure               |  7 +++----
>  14 files changed, 35 insertions(+), 33 deletions(-)
>
> diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
> index c1ec92ffb15..751c250ddb3 100644
> --- a/gcc/config/i386/i386.h
> +++ b/gcc/config/i386/i386.h
> @@ -2091,9 +2091,9 @@ do {                                                    
>   \
>  #define DEBUGGER_REGNO(N) \
>    (TARGET_64BIT ? debugger64_register_map[(N)] : debugger_register_map[(N)])
>
> -extern int const debugger_register_map[FIRST_PSEUDO_REGISTER];
> -extern int const debugger64_register_map[FIRST_PSEUDO_REGISTER];
> -extern int const svr4_debugger_register_map[FIRST_PSEUDO_REGISTER];
> +extern unsigned int const debugger_register_map[FIRST_PSEUDO_REGISTER];
> +extern unsigned int const debugger64_register_map[FIRST_PSEUDO_REGISTER];
> +extern unsigned int const svr4_debugger_register_map[FIRST_PSEUDO_REGISTER];
>
>  /* Before the prologue, RA is at 0(%esp).  */
>  #define INCOMING_RETURN_ADDR_RTX \
> diff --git a/gcc/diagnostic-event-id.h b/gcc/diagnostic-event-id.h
> index 8237ba34df3..06985d23c12 100644
> --- a/gcc/diagnostic-event-id.h
> +++ b/gcc/diagnostic-event-id.h
> @@ -67,6 +67,6 @@ typedef diagnostic_event_id_t *diagnostic_event_id_ptr;
>  /* A type for compactly referring to a particular thread within a
>     diagnostic_path.  Typically there is just one thread per path,
>     with id 0.  */
> -typedef unsigned diagnostic_thread_id_t;
> +typedef int diagnostic_thread_id_t;
>
>  #endif /* ! GCC_DIAGNOSTIC_EVENT_ID_H */
> diff --git a/gcc/vec.h b/gcc/vec.h
> index bc83827f644..b13c4716428 100644
> --- a/gcc/vec.h
> +++ b/gcc/vec.h
> @@ -2409,7 +2409,7 @@ public:
>    const value_type &back () const;
>    const value_type &operator[] (unsigned int i) const;
>
> -  size_t size () const { return m_size; }
> +  unsigned size () const { return m_size; }
>    size_t size_bytes () const { return m_size * sizeof (T); }
>    bool empty () const { return m_size == 0; }
>
> diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
> index 7dbae1d72e3..2f736a3b346 100644
> --- a/gcc/config/i386/i386.cc
> +++ b/gcc/config/i386/i386.cc
> @@ -181,7 +181,7 @@ enum reg_class const regclass_map[FIRST_PSEUDO_REGISTER] =
>
>  /* The "default" register map used in 32bit mode.  */
>
> -int const debugger_register_map[FIRST_PSEUDO_REGISTER] =
> +unsigned int const debugger_register_map[FIRST_PSEUDO_REGISTER] =
>  {
>    /* general regs */
>    0, 2, 1, 3, 6, 7, 4, 5,
> @@ -212,7 +212,7 @@ int const debugger_register_map[FIRST_PSEUDO_REGISTER] =
>
>  /* The "default" register map used in 64bit mode.  */
>
> -int const debugger64_register_map[FIRST_PSEUDO_REGISTER] =
> +unsigned int const debugger64_register_map[FIRST_PSEUDO_REGISTER] =
>  {
>    /* general regs */
>    0, 1, 2, 3, 4, 5, 6, 7,
> @@ -294,7 +294,7 @@ int const debugger64_register_map[FIRST_PSEUDO_REGISTER] =
>         17 for %st(6) (gcc regno = 14)
>         18 for %st(7) (gcc regno = 15)
>  */
> -int const svr4_debugger_register_map[FIRST_PSEUDO_REGISTER] =
> +unsigned int const svr4_debugger_register_map[FIRST_PSEUDO_REGISTER] =
>  {
>    /* general regs */
>    0, 2, 1, 3, 6, 7, 5, 4,
> diff --git a/gcc/ipa-modref.cc b/gcc/ipa-modref.cc
> index 400a8856de2..19359662f8f 100644
> --- a/gcc/ipa-modref.cc
> +++ b/gcc/ipa-modref.cc
> @@ -1997,7 +1997,7 @@ struct escape_point
>    /* Value escapes to this call.  */
>    gcall *call;
>    /* Argument it escapes to.  */
> -  int arg;
> +  unsigned int arg;
>    /* Flags already known about the argument (this can save us from recording
>       escape points if local analysis did good job already).  */
>    eaf_flags_t min_flags;
> @@ -2047,7 +2047,8 @@ public:
>    bool merge_deref (const modref_lattice &with, bool ignore_stores);
>    bool merge_direct_load ();
>    bool merge_direct_store ();
> -  bool add_escape_point (gcall *call, int arg, int min_flags, bool diret);
> +  bool add_escape_point (gcall *call, unsigned int arg,
> +                        eaf_flags_t min_flags, bool direct);
>    void dump (FILE *out, int indent = 0) const;
>  };
>
> @@ -2101,8 +2102,8 @@ modref_lattice::dump (FILE *out, int indent) const
>     point exists.  */
>
>  bool
> -modref_lattice::add_escape_point (gcall *call, int arg, int min_flags,
> -                                 bool direct)
> +modref_lattice::add_escape_point (gcall *call, unsigned arg,
> +                                 eaf_flags_t min_flags, bool direct)
>  {
>    escape_point *ep;
>    unsigned int i;
> @@ -4415,12 +4416,12 @@ update_escape_summary_1 (cgraph_edge *e,
>         continue;
>        FOR_EACH_VEC_ELT (map[ee->parm_index], j, em)
>         {
> -         int min_flags = ee->min_flags;
> +         eaf_flags_t min_flags = ee->min_flags;
>           if (ee->direct && !em->direct)
>             min_flags = deref_flags (min_flags, ignore_stores);
>           struct escape_entry entry = {em->parm_index, ee->arg,
>                                        min_flags,
> -                                      ee->direct & em->direct};
> +                                      ee->direct && em->direct};
>           sum->esc.safe_push (entry);
>         }
>      }
> diff --git a/gcc/pair-fusion.cc b/gcc/pair-fusion.cc
> index cb0374f426b..653055fdcf6 100644
> --- a/gcc/pair-fusion.cc
> +++ b/gcc/pair-fusion.cc
> @@ -444,7 +444,7 @@ pair_fusion_bb_info::track_access (insn_info *insn, bool 
> load_p, rtx mem)
>    const bool fpsimd_op_p = m_pass->fpsimd_op_p (reg_op, mem_mode, load_p);
>
>    // Note pair_operand_mode_ok_p already rejected VL modes.
> -  const HOST_WIDE_INT mem_size = GET_MODE_SIZE (mem_mode).to_constant ();
> +  const unsigned mem_size = GET_MODE_SIZE (mem_mode).to_constant ();
>    const lfs_fields lfs = { load_p, fpsimd_op_p, mem_size };
>
>    if (track_via_mem_expr (insn, mem, lfs))
> diff --git a/gcc/pretty-print.cc b/gcc/pretty-print.cc
> index 998e06e155f..0cd9b4d0a41 100644
> --- a/gcc/pretty-print.cc
> +++ b/gcc/pretty-print.cc
> @@ -1923,7 +1923,7 @@ format_phase_2 (pretty_printer *pp,
>             /* When quoting, print alphanumeric, punctuation, and the space
>                character unchanged, and all others in hexadecimal with the
>                "\x" prefix.  Otherwise print them all unchanged.  */
> -           int chr = va_arg (*text.m_args_ptr, int);
> +           char chr = (char) va_arg (*text.m_args_ptr, int);
>             if (ISPRINT (chr) || !quote)
>               pp_character (pp, chr);
>             else
> diff --git a/gcc/tree-ssa-loop-ch.cc b/gcc/tree-ssa-loop-ch.cc
> index 525eb357858..6552ddd1ee2 100644
> --- a/gcc/tree-ssa-loop-ch.cc
> +++ b/gcc/tree-ssa-loop-ch.cc
> @@ -839,8 +839,8 @@ ch_base::copy_headers (function *fun)
>          copied.  TODO -- handle while (a || b) - like cases, by not requiring
>          the header to have just a single successor and copying up to
>          postdominator.  */
> -      int nheaders = 0;
> -      int last_win_nheaders = 0;
> +      unsigned int nheaders = 0;
> +      unsigned int last_win_nheaders = 0;
>        bool last_win_invariant_exit = false;
>        ch_decision ret;
>        auto_vec <ch_decision, 32> decision;
> @@ -893,7 +893,7 @@ ch_base::copy_headers (function *fun)
>         }
>        /* "Duplicate" all BBs with zero cost following last basic blocks we
>          decided to copy.  */
> -      while (last_win_nheaders < (int)decision.length ()
> +      while (last_win_nheaders < decision.length ()
>              && decision[last_win_nheaders] == ch_possible_zero_cost)
>         {
>           if (dump_file && (dump_flags & TDF_DETAILS))
> diff --git a/gcc/tree-ssa-structalias.cc b/gcc/tree-ssa-structalias.cc
> index a32ef1d5cc0..7adb50a896d 100644
> --- a/gcc/tree-ssa-structalias.cc
> +++ b/gcc/tree-ssa-structalias.cc
> @@ -5925,7 +5925,7 @@ field_must_have_pointers (tree t)
>
>  static bool
>  push_fields_onto_fieldstack (tree type, vec<fieldoff_s> *fieldstack,
> -                            HOST_WIDE_INT offset)
> +                            unsigned HOST_WIDE_INT offset)
>  {
>    tree field;
>    bool empty_p = true;
> @@ -5943,7 +5943,7 @@ push_fields_onto_fieldstack (tree type, vec<fieldoff_s> 
> *fieldstack,
>      if (TREE_CODE (field) == FIELD_DECL)
>        {
>         bool push = false;
> -       HOST_WIDE_INT foff = bitpos_of_field (field);
> +       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.

>         tree field_type = TREE_TYPE (field);
>
>         if (!var_can_have_subvars (field)
> @@ -5988,7 +5988,7 @@ push_fields_onto_fieldstack (tree type, vec<fieldoff_s> 
> *fieldstack,
>                 && !must_have_pointers_p
>                 && !pair->must_have_pointers
>                 && !pair->has_unknown_size
> -               && pair->offset + (HOST_WIDE_INT)pair->size == offset + foff)
> +               && pair->offset + pair->size == offset + foff)
>               {
>                 pair->size += tree_to_uhwi (DECL_SIZE (field));
>               }
> diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
> index 9c817de18bd..0bd385f2328 100644
> --- a/gcc/tree-vect-slp.cc
> +++ b/gcc/tree-vect-slp.cc
> @@ -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?

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.

OK with that change.
Richard.

>      }
>    else
> diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
> index 45003f762dd..688b8715a15 100644
> --- a/gcc/tree-vect-stmts.cc
> +++ b/gcc/tree-vect-stmts.cc
> @@ -1711,11 +1711,11 @@ vect_truncate_gather_scatter_offset (stmt_vec_info 
> stmt_info,
>      count = max_iters.to_shwi ();
>
>    /* Try scales of 1 and the element size.  */
> -  int scales[] = { 1, vect_get_scalar_dr_size (dr_info) };
> +  unsigned int scales[] = { 1, vect_get_scalar_dr_size (dr_info) };
>    wi::overflow_type overflow = wi::OVF_NONE;
>    for (int i = 0; i < 2; ++i)
>      {
> -      int scale = scales[i];
> +      unsigned int scale = scales[i];
>        widest_int factor;
>        if (!wi::multiple_of_p (wi::to_widest (step), scale, SIGNED, &factor))
>         continue;
> @@ -6528,7 +6528,8 @@ vectorizable_operation (vec_info *vinfo,
>    poly_uint64 nunits_in;
>    poly_uint64 nunits_out;
>    tree vectype_out;
> -  int ncopies, vec_num;
> +  unsigned int ncopies;
> +  int vec_num;
>    int i;
>    vec<tree> vec_oprnds0 = vNULL;
>    vec<tree> vec_oprnds1 = vNULL;
> diff --git a/gcc/configure.ac b/gcc/configure.ac
> index 8a2d2b0438e..23f4884eff9 100644
> --- a/gcc/configure.ac
> +++ b/gcc/configure.ac
> @@ -585,7 +585,6 @@ AC_SUBST(aliasing_flags)
>  # * 'long long'
>  # * variadic macros
>  # * overlong strings
> -# * C++11 narrowing conversions in { }
>  # So, we only use -pedantic if we can disable those warnings.
>
>  # In stage 1, disable -Wformat warnings from old GCCs about new % codes
> @@ -595,7 +594,7 @@ AC_ARG_ENABLE(build-format-warnings,
>  AS_IF([test $enable_build_format_warnings = no],
>        [wf_opt=-Wno-format],[wf_opt=])
>  ACX_PROG_CXX_WARNING_OPTS(
> -       m4_quote(m4_do([-W -Wall -Wno-narrowing -Wwrite-strings ],
> +       m4_quote(m4_do([-W -Wall -Wno-error=narrowing -Wwrite-strings ],
>                        [-Wcast-qual $wf_opt])),
>                        [loose_warn])
>  ACX_PROG_CC_WARNING_OPTS(
> diff --git a/gcc/rtl-ssa/member-fns.inl b/gcc/rtl-ssa/member-fns.inl
> index d39184fb8cd..143c22c8c77 100644
> --- a/gcc/rtl-ssa/member-fns.inl
> +++ b/gcc/rtl-ssa/member-fns.inl
> @@ -41,7 +41,8 @@ access_array_builder::quick_push (access_info *access)
>  inline array_slice<access_info *>
>  access_array_builder::finish ()
>  {
> -  auto num_accesses = obstack_object_size (m_obstack) / sizeof (access_info 
> *);
> +  unsigned num_accesses
> +    = obstack_object_size (m_obstack) / sizeof (access_info *);
>    if (num_accesses == 0)
>      return {};
>
> diff --git a/gcc/configure b/gcc/configure
> index 3d301b6ecd3..5acc42c1e4d 100755
> --- a/gcc/configure
> +++ b/gcc/configure
> @@ -7146,7 +7146,6 @@ fi
>  # * 'long long'
>  # * variadic macros
>  # * overlong strings
> -# * C++11 narrowing conversions in { }
>  # So, we only use -pedantic if we can disable those warnings.
>
>  # In stage 1, disable -Wformat warnings from old GCCs about new % codes
> @@ -7170,7 +7169,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
>
>  loose_warn=
>  save_CXXFLAGS="$CXXFLAGS"
> -for real_option in -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual 
> $wf_opt; do
> +for real_option in -W -Wall -Wno-error=narrowing -Wwrite-strings -Wcast-qual 
> $wf_opt; do
>    # Do the check with the no- prefix removed since gcc silently
>    # accepts any -Wno-* option on purpose
>    case $real_option in
> @@ -21406,7 +21405,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 21409 "configure"
> +#line 21408 "configure"
>  #include "confdefs.h"
>
>  #if HAVE_DLFCN_H
> @@ -21512,7 +21511,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 21515 "configure"
> +#line 21514 "configure"
>  #include "confdefs.h"
>
>  #if HAVE_DLFCN_H
>
> base-commit: 2484ba167e1c4a52d4989b71e1f5d4d27755500f
> --
> 2.46.0
>

Reply via email to