On Thu, 2021-05-27 at 10:41 -0600, Martin Sebor wrote:
> On 5/27/21 5:19 AM, Richard Sandiford wrote:
> > Thanks for doing this.
> > 
> > Martin Sebor via Gcc-patches <gcc-patches@gcc.gnu.org> writes:
> > > […]
> > > On 5/24/21 5:08 PM, David Malcolm wrote:
> > > > On Mon, 2021-05-24 at 16:02 -0600, Martin Sebor wrote:
> > > > > Subsequent patches then replace invocations of the
> > > > > TREE_NO_WARNING()
> > > > > macro and the gimple_no_warning_p() and
> > > > > gimple_set_no_warning()
> > > > > functions throughout GCC with those and remove the legacy
> > > > > APIs to
> > > > > keep them from being accidentally reintroduced along with the
> > > > > problem.
> > > > > These are mostly mechanical changes, except that most of the
> > > > > new
> > > > > invocations also specify the option whose disposition to
> > > > > query for
> > > > > the expression or location, or which to enable or disable[2].
> > > > > The last function, copy_no_warning(), copies the disposition
> > > > > from
> > > > > one expression or location to another.
> > > > > 
> > > > > A couple of design choices might be helpful to explain:
> > > > > 
> > > > > First, introducing "warning groups" rather than controlling
> > > > > each
> > > > > individual warning is motivated by a) the fact that the
> > > > > latter
> > > > > would make avoiding redundant warnings for related problems
> > > > > cumbersome (e.g., after issuing a -Warray-bounds we want to
> > > > > suppress -Wstringop-overflow as well -Wstringop-overread for
> > > > > the same access and vice versa), and b) simplicity and
> > > > > efficiency
> > > > > of the implementation (mapping each option would require a
> > > > > more
> > > > > complex data structure like a bitmap).
> > > > > 
> > > > > Second, using location_t to associate expressions/statements
> > > > > with
> > > > > the warning groups also turns out to be more useful in
> > > > > practice
> > > > > than a direct association between a tree or gimple*, and also
> > > > > simplifies managing the data structure.  Trees and gimple*
> > > > > come
> > > > > and go across passes, and maintaining a mapping for them that
> > > > > accounts for the possibility of them being garbage-collected
> > > > > and the same addresses reused is less than straightforward.
> > > > 
> > > > I find some of the terminology rather awkard due to it the
> > > > negation
> > > > we're already using with TREE_NO_WARNING, in that we're turning
> > > > on a
> > > > no_warning flag, and that this is a per-location/expr/stmt
> > > > thing that's
> > > > different from the idea of enabling/disabling a specific
> > > > warning
> > > > altogether (and the pragmas that control that).   Sometimes the
> > > > patches
> > > > refer to enabling/disabling warnings and I think I want
> > > > "enabling" and
> > > > "disabling" to mean the thing the user does with -Wfoo and -
> > > > Wno-foo.
> > > > 
> > > > Would calling it a "warning suppression" or somesuch be more or
> > > > less
> > > > klunky?
> > > 
> > > I like warning suppression :)  But I'm not sure where you suggest
> > > I use the phrase.
> > > 
> > > I don't particularly care for the "no" in the API names either
> > > (existing or new) and would prefer a positive form.  I considered
> > > enable_warning() and warning_enabled() but I chose the names I
> > > did
> > > because they're close to their established gimple namesakes.  I'm
> > > fine changing them to the alternatives, or if you or someone else
> > > has a preference for different names I'm open to suggestions. 
> > > Let
> > > me know.
> > 
> > Not my area, but FWIW, +1 for David's suggestion of
> > s/set_no_warning/suppress_warning/ or similar.  As well as the
> > problem with the double negative in negated conditions, I always
> > have to
> > remember whether TREE_NO_WARNING means that hasn't been anything to
> > warn
> > about yet or whether we shouldn't warn in future.
> 
> Sure.  Jason has a patch out for review to introduce
> 
>    warning_enabled_at (location, int option).

CCing Jason.

BTW, do you have a URL for that patch?

> 
> With that, how does the following API look? (I'd replace the int
> argument above with opt_code myself):
> 
>    void enable_warning (location_t, enum opt_code = N_OPTS);
>    void disable_warning (location_t, enum opt_code = N_OPTS);
>    void copy_warning (location_t, location_t);
>    bool warning_enabled_at (location_t, enum opt_code = N_OPTS).
> 
>    void enable_warning (tree, enum opt_code = N_OPTS);
>    void disable_warning (tree, enum opt_code = N_OPTS);
>    void copy_warning (tree, const_tree);
>    bool warning_enabled_at (const_tree, enum opt_code = N_OPTS).
> 
>    void enable_warning (gimple *, enum opt_code = N_OPTS);
>    void disable_warning (gimple *, enum opt_code = N_OPTS);
>    void copy_warning (gimple *, const gimple *);
>    bool warning_enabled_at (gimple *, enum opt_code = N_OPTS).

I'm not so happy with "enable_warning" and "disable_warning" in the
above proposal; it seems to me that three things are being conflated:

(a) whether the user enabled the warning with -Wfoo, whether at the
command line, or by #pragma (and using the location_t to query the
pragma information)

versus

(b) whether we're suppressing a category of warnings for this construct
(and using the location_t to stash the flags)

versus

(c) should the warning actually be emitted at the location

Presumably Jason's patch is a way for our warning code (in the FE and
middle end) to avoid doing expensive things by querying whether the
warning would actually get emitted i.e. it's a way to query (c), so we
can have an early-reject if it returns false, where presumably the
query is cheap relative to the testing that would otherwise occur.  Is
that right?

Perhaps the terminology should be that:
- the user *requests* a warning, (a) above
- our code can *suppress* a warning, for (b) above
- the combination of the two give (c): whether the warning is *enabled*

Or maybe
(a) the user *enables* a warning 
(b) our code can *suppress* a warning (or warning category)
(c) the combination gives whether the warning is *active*.

or somesuch.

Thoughts?
Dave

Reply via email to