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 "’":

   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.

> 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:

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

Hope this is constructive
Dave

Reply via email to