[PATCH] Improve diagnostic message for misplaced square brackets

Richard Smith richard at metafoo.co.uk
Fri May 9 13:41:14 PDT 2014


On Fri, May 9, 2014 at 1:38 PM, Richard Smith <richard at metafoo.co.uk> wrote:

> On Fri, May 9, 2014 at 1:31 PM, Richard Trieu <rtrieu at google.com> wrote:
>
>> ================
>> Comment at: lib/Parse/ParseDecl.cpp:4841
>> @@ -4824,3 +4840,3 @@
>>      // portion is empty), if an abstract-declarator is allowed.
>>      D.SetIdentifier(0, Tok.getLocation());
>>
>> ----------------
>> Richard Smith wrote:
>> > This looks like it'll provide the wrong location if there were
>> misplaced brackets.
>> The recovery for brackets requires !D.mayOmitIdentifier() [line 4710]
>> while this branch requires D.mayOmitIdentifier().  Either bracket recovery
>> happens or this code executes, but not both.
>>
>> ================
>> Comment at: lib/Parse/ParseDecl.cpp:4862
>> @@ -4838,3 +4861,3 @@
>>                                          :
>> D.getDeclSpec().getSourceRange());
>> -    else if (getLangOpts().CPlusPlus) {
>> -      if (Tok.is(tok::period) || Tok.is(tok::arrow))
>> +    } else if (getLangOpts().CPlusPlus) {
>> +      if (!UnhandledError && (Tok.is(tok::period) || Tok.is(tok::arrow)))
>> ----------------
>> Richard Smith wrote:
>> > Have you considered putting the bracket parsing code way down here (and
>> recursively calling back into this function after parsing them)?
>> Currently, the error correction of:
>>   int [1] a [2];
>> to
>>   int a[1][2];
>>
>> If this was done recursively, the bracket recovery would go to the end
>> instead to:
>>   int a[2][1];
>
>
> I think the latter is the right answer. If we think of
>
>   int [1] a [2];
>
> ... as meaning
>
>   T a[2]; with T = int[1]
>
> ... then that's the same as
>
>   int a[2][1];
>

Another example:

  int [3] *f();

... should be interpreted as/corrected to

  int (*f())[3]

... (that is, a function returning a pointer to an array of three ints) not
as:

  int *f[3]()

(which is an ill-formed declaration of an array of three functions).
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140509/f4375713/attachment.html>


More information about the cfe-commits mailing list