[PATCH] Attribute parsing following labels

Aaron Ballman aaron at aaronballman.com
Mon Oct 7 13:21:00 PDT 2013


On Mon, Oct 7, 2013 at 4:16 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> +  // Read label attributes, if present. TempAttrs will contain both C++11
> and
> +  // GNU attributes (if present) after this point.
>
> This isn't true: we're only parsing GNU attributes here.

Sorry, that's a holdover from the existing comment.  I'll correct it.
>
> +    } else {
> +      StmtVector Stmts;
> +      SubStmt = ParseStatementOrDeclarationAfterAttributes(Stmts, true, 0,
> +                                                           TempAttrs);
>
> This doesn't look like it'll correctly handle the case where
> ParseStatementOrDeclarationAfterAttributes returns null (because we parsed a
> pragma or the like). If you're relying on this being impossible (because an
> attribute can't apply to a #pragma), please insert an assert here (that
> SubStmt is invalid or usable).

Doesn't that get handled slightly further down?

  // Broken substmt shouldn't prevent the label from being added to the AST.
  if (SubStmt.isInvalid())
    SubStmt = Actions.ActOnNullStmt(ColonLoc);

>
> Oh, also: please add test cases for #pragmas appearing near the attributes.

Shall do.

Thanks!

~Aaron

> On Sat, Oct 5, 2013 at 2:09 PM, Aaron Ballman <aaron at aaronballman.com>
> wrote:
>>
>> Here is another attempt at this patch, without the tentative parsing.
>>
>> Thanks!
>>
>> ~Aaron
>>
>> On Tue, Oct 1, 2013 at 12:43 PM, Richard Smith <richard at metafoo.co.uk>
>> wrote:
>> > OK, that makes some sense, since the pragma acts like a statement that
>> > cannot have an attribute.
>> >
>> > On 1 Oct 2013 05:26, "Aaron Ballman" <aaron at aaronballman.com> wrote:
>> >>
>> >> On Mon, Sep 30, 2013 at 6:03 PM, Richard Smith <richard at metafoo.co.uk>
>> >> wrote:
>> >> > It should be possible to handle this case without tentative parsing
>> >> > or
>> >> > lookahead. Consume the attributes onto a new list; if the next token
>> >> > is
>> >> > a
>> >> > semicolon, then push them into the label's attribute list; otherwise,
>> >> > ParseStatementOrDeclarationAfterAttributes.
>> >>
>> >> Ah, thanks!
>> >>
>> >> > What does GCC do if there are #pragmas between the case label and the
>> >> > attribute, and/or between the attribute and the semicolon?
>> >>
>> >> void func(void) {
>> >> label: __attribute__((unused))
>> >> #pragma message "stuff"
>> >> ;
>> >> }
>> >>
>> >> Prints the message, no warning about the label or the attribute.
>> >>
>> >> void func(void) {
>> >> label:
>> >> #pragma message "stuff"
>> >> __attribute__((unused))
>> >> ;
>> >> }
>> >>
>> >> Prints the message, then prints an error about expecting an expression
>> >> before the attribute, and a warning for the label being unused.
>> >>
>> >> ~Aaron
>
>



More information about the cfe-commits mailing list