On Tue, 2021-06-22 at 19:18 -0400, David Malcolm wrote:
> On Fri, 2021-06-04 at 15:41 -0600, Martin Sebor wrote:
> > The attached patch introduces the suppress_warning(),
> > warning_suppressed(), and copy_no_warning() APIs without making
> > use of them in the rest of GCC. They are in three files:
> >
> > diagnostic-spec.{h,c}: Location-centric overloads.
> > warning-control.cc: Tree- and gimple*-centric overloads.
> >
> > The location-centric overloads are suitable to use from the
> > diagnostic
> > subsystem. The rest can be used from the front ends and the middle
> > end.
>
> [...snip...]
>
> > +/* Return true if warning OPT is suppressed for decl/expression
> > EXPR.
> > + By default tests the disposition for any warning. */
> > +
> > +bool
> > +warning_suppressed_p (const_tree expr, opt_code opt /* =
> > all_warnings */)
> > +{
> > + const nowarn_spec_t *spec = get_nowarn_spec (expr);
> > +
> > + if (!spec)
> > + return get_no_warning_bit (expr);
> > +
> > + const nowarn_spec_t optspec (opt);
> > + bool dis = *spec & optspec;
> > + gcc_assert (get_no_warning_bit (expr) || !dis);
> > + return dis;
>
> Looking through the patch, I don't like the use of "dis" for the "is
> suppressed" bool, since...
>
> [...snip...]
>
> > +
> > +/* Enable, or by default disable, a warning for the statement STMT.
> > + The wildcard OPT of -1 controls all warnings. */
>
> ...I find the above comment to be confusingly worded due to the double-
> negative.
>
> If I'm reading your intent correctly, how about this wording:
>
> /* Change the supression of warnings for statement STMT.
> OPT controls which warnings are affected.
> The wildcard OPT of -1 controls all warnings.
> If SUPP is true (the default), enable the suppression of the
> warnings.
> If SUPP is false, disable the suppression of the warnings. */
>
> ...and rename "dis" to "supp".
>
> Or have I misread the intent of the patch?
>
> > +
> > +void
> > +suppress_warning (gimple *stmt, opt_code opt /* = all_warnings */,
> > + bool dis /* = true */)
>
> > +{
> > + if (opt == no_warning)
> > + return;
> > +
> > + const key_type_t key = convert_to_key (stmt);
> > +
> > + dis = suppress_warning_at (key, opt, dis) || dis;
> > + set_no_warning_bit (stmt, dis);
> > +}
>
> [...snip...]
Also, I think I prefer having a separate entrypoints for the "all
warnings" case; on reading through the various patches I think that in
e.g.:
- TREE_NO_WARNING (*expr_p) = 1;
+ suppress_warning (*expr_p);
I prefer:
suppress_warnings (*expr_p);
(note the plural) since that way we can grep for them, and it seems
like better grammar to me.
Both entrypoints could be implemented by a static suppress_warning_1
internally if that makes it easier.
In that vein, "unsuppress_warning" seems far clearer to me that
"suppress_warning (FOO, false)"; IIRC there are very few uses of this
non-default arg (I couldn't find any in a quick look through the v2
kit).
Does this make sense?
Dave