On Fri, 2019-05-17 at 12:07 -0600, Martin Sebor wrote:
> On 5/17/19 11:16 AM, David Malcolm wrote:
> > On Fri, 2019-05-17 at 09:02 -0600, Martin Sebor wrote:
> > > On 5/17/19 7:43 AM, David Malcolm wrote:
> > > > On Thu, 2019-05-16 at 18:40 -0600, Martin Sebor wrote:
> > > > > On 5/16/19 5:22 PM, Joseph Myers wrote:
> > > > > > On Tue, 14 May 2019, Martin Sebor wrote:
> > > > > > 
> > > > > > > The attached patch fixes quoting, spelling, and other
> > > > > > > formatting
> > > > > > > issues in diagnostics issued from files in the c-family/
> > > > > > > directory
> > > > > > > and pointed out by the -Wformat-diag warning.
> > > > > > 
> > > > > > Some of the changes in this patch are questionable.  The
> > > > > > diagnostics for
> > > > > > attribute scalar_storage_order and visibility arguments use
> > > > > > \"
> > > > > > because the
> > > > > > argument is a string constant not an identifier.  So making
> > > > > > those
> > > > > > use %qs
> > > > > > makes the diagnostics misleading, by suggesting an
> > > > > > attribute
> > > > > > argument is
> > > > > > used that is not in fact valid for that attribute.
> > > > > 
> > > > > Hmm, yes.  I introduced it elsewhere as well in some of my
> > > > > prior
> > > > > changes, and it existed even before then in
> > > > > handle_visibility_attribute:
> > > > > 
> > > > >        error ("%qD was declared %qs which implies default
> > > > > visibility",
> > > > >               decl, "dllexport");
> > > > > 
> > > > > There is a way to highlight a string without enclosing it in
> > > > > both
> > > > > single and double quotes:
> > > > > 
> > > > >        error ("attribute %qE argument must be one of %r%s%R
> > > > > or
> > > > > %r%s%R",
> > > > >               name, "locus", "\"big-endian\"",
> > > > >               "locus", "\"little-endian\"");
> > > > > 
> > > > > It's not pretty but it does the job.
> > > > 
> > > > Interesting idea, but I'm not sure if it's the right way to go
> > > > here.
> > > > 
> > > > Do we have other examples of highlighting strings within a
> > > > diagnostic?
> > > > 
> > > > The colorization typically doesn't show up in compilation
> > > > logs.  It's
> > > > also not easy to test for in DejaGnu (but I can think of some
> > > > ways
> > > > to
> > > > make that easier).
> > > > 
> > > > >    Unless you know of some other
> > > > > trick I'll go with it and fix up the existing mistakes the
> > > > > same
> > > > > way
> > > > > in a followup commit.
> > > > 
> > > > Please can we focus this discussion on what it ought to look
> > > > like
> > > > from
> > > > the end-user's point of view? (rather than on our
> > > > implementation
> > > > details)
> > > > 
> > > > Can you give a concrete example of some source that triggers
> > > > this
> > > > diagnostic, what the current output is, and what the output
> > > > given
> > > > the
> > > > current candidate patch is?
> > > > 
> > > > (i.e. what does it look like to the end-user? what are our
> > > > ideas
> > > > for
> > > > what should it look like?)
> > > > 
> > > > [this may be lack of coffee on my part, but I find it easier to
> > > > think
> > > > and talk about actual input/output examples, rather than
> > > > diagnostic
> > > > API
> > > > calls and DejaGnu testcases, and let the former lead the
> > > > latter]
> > > 
> > > Here's an example:
> > > 
> > >     struct __attribute__ ((scalar_storage_order ("big endian")))
> > > S {
> > > int
> > > i; };
> > > 
> > > and here's the output with the latest patch and using %r/%R:
> > > 
> > > $ gcc -O2 -S -Wall b.c
> > > b.c:1:62: error: attribute ‘scalar_storage_order’ argument must
> > > be
> > > one
> > > of "big-endian" or "little-endian"
> > >       1 | struct __attribute__ ((scalar_storage_order ("big
> > > endian")))
> > > S
> > > { int i; };
> > >         |
> > >   ^
> > > 
> > > The name scalar_storage_order is highlighted (and in single
> > > quotes)
> > > and the strings "big-endian" and "little-endian" are just
> > > highlighted
> > > (including the quotes, but no single-quotes).  That looks right
> > > to
> > > me but YMMV.
> > > 
> > > What Joseph pointed out is that using %qs to quote big-endian
> > > ends
> > > up with either
> > > 
> > >     error: attribute ‘scalar_storage_order’ argument must be one
> > > of
> > > 'big-endian' or 'little-endian'
> > > 
> > > if the strings are just big-endian and little-endian (i.e., not
> > > including the double-quotes), which suggests to the user they
> > > shouldn't be quoted in the source either, or with
> > > 
> > >     error: attribute ‘scalar_storage_order’ argument must be one
> > > of
> > > '"big-endian"' or '"little-endian"'
> > 
> > This was actually the thing I had in the back in my mind when I
> > sent my
> > last email.
> > 
> > The above uses "'", but the quoting would use "‘" and "’":
> 
> Sure, depending on the locale.  Either way, we end up two pairs
> of quotes around the string.
> 
> > 
> >     error: attribute ‘scalar_storage_order’ argument must be one of
> >     ‘"big-endian"’ or ‘"little-endian"’
> > 
> > > if the strings themselves contain the double-quotes (i.e., are
> > > passed to %qs as "\"big-endian\""...
> > 
> > An easy way to implement this would be via:
> >    "must be one of %<\"%s\"%> or " etc
> > which would avoid having to manipulate the name.
> 
> Yes, but bug 90156 and check-internal-format-escaping.py want to
> banish this form so that's what I've implemented in the -Wformat-
> diag checker as well.

Presumably you're referring to bug 90156's:
  "please also add \"%s\" to the forbidden string literals."

The checker presumably could treat %<\"%s\"%>  as an exception to this
rule.  If that form is best here (I think it is), then the checker
should be fixed to allow that; otherwise, aren't we putting the cart
before the horse?

> > > Single-quoting a string in
> > > double-quotes, although technically correct, looks odd to me.
> > 
> > I think it's clearer, though I agree it does look odd.
> > 
> > I think I prefer single-quoting the double-quoted string in that
> > the
> > user isn't meant to have wrapped
> >    scalar_storage_order
> > in double-quotes, but they are meant to have wrapped the argument
> > in
> > double-quotes.
> > 
> > > Unpatched trunk doesn't highlight anything which is what I'm
> > > fixing.
> > 
> > My other thought is: do we have enough location information to
> > offer
> > fix-it hints.  Then it could be something like:
> 
> I don't think we do have the location of attribute arguments.  It
> would be nice if we did for reasons other than the quoting issue.

Yeah.  Fixing that would probably require some changes to how we handle
attributes, though (e.g. passing a location_t around with the
attributes?)

> > 
> > error: attribute ‘scalar_storage_order’ argument must be
> > one of ‘"big-endian"’...
> >     1 | struct __attribute__ ((scalar_storage_order ("big
> > endian"))) S { int i; };
> >       |                                              ~~~~~~~~~~~~  
> >   ^
> >       |                                              "big-endian"
> > note: ...or ‘"little-endian"’
> >     1 | struct __attribute__ ((scalar_storage_order ("big
> > endian"))) S {
> > int i; };
> >       |                                              ~~~~~~~~~~~~  
> >   ^
> >       |                                              "little-
> > endian"
> > 
> > Even if we don't have location information, it strikes me that for
> > a
> > close match like this, some kind of "do you mean" spellcheck-style
> > hint
> > might be appropriate:
> > 
> > error: attribute ‘scalar_storage_order’ argument must be one of
> > ‘"big-
> > endian"’  or ‘"little-endian"’; did you mean ‘"big-endian"’?
> >     1 | struct __attribute__ ((scalar_storage_order ("big
> > endian"))) S {
> > int i; };
> >       |                                              ~~~~~~~~~~~~  
> >   ^
> >       |                                              "big-endian"
> > 
> > Or somesuch
> 
> Sure.  It's a nice enhancement but it doesn't solve with the problem
> of two pairs of quotes.
> 
> Martin

Reply via email to