[PATCH] Attribute parsing following labels

Aaron Ballman aaron at aaronballman.com
Wed Oct 30 15:16:50 PDT 2013


Finally have some spare time to look into this again, thank you for
your patience.  :-)

On Tue, Oct 15, 2013 at 12:46 AM, Richard Smith <richard at metafoo.co.uk> wrote:
> +      SourceLocation Loc = Tok.getLocation();
>
> Unused variable.
>
> +      // If the SubStmt is invalid, we want the attributes to attach to the
> +      // label instead.
> +      if (!SubStmt.isUsable() || SubStmt.isInvalid())
> +        attrs.takeAllFrom(TempAttrs);
>
> I thought your experiments showed the attributes were ill-formed in this
> case.

Since it's been a while, I went back to re-test my experiments, and I
think I made a mistake.

void f() {
    A:
      __attribute__((unused)) int i; // attribute applies to variable
    B:
      __attribute__((unused)); // attribute applies to label

    C:
      __attribute__((unused))
      #pragma weak unused_local_static
      ;

    D:
      #pragma weak unused_local_static
      __attribute__((unused))
      ;
}

*Both* of these cases generate errors in gcc. What I didn't realize is
that gcc stopped trying to report errors with D because C was
ill-formed.

With D commented out, I get:

prog.cpp: In function ‘void f()’:
prog.cpp:8:7: error: expected primary-expression before ‘__attribute__’
       __attribute__((unused))
       ^
prog.cpp:8:7: error: expected ‘;’ before ‘__attribute__’
prog.cpp:9:39: error: expected ‘}’ before end of line
       #pragma weak unused_local_static
                                       ^
prog.cpp:2:5: warning: label ‘A’ defined but not used [-Wunused-label]
     A:
     ^
prog.cpp:7:5: warning: label ‘C’ defined but not used [-Wunused-label]
     C:
     ^
prog.cpp: At global scope:
prog.cpp:9:39: error: expected declaration before end of line
       #pragma weak unused_local_static

With C commented out, I get:

prog.cpp: In function ‘void f()’:
prog.cpp:14:7: error: expected primary-expression before ‘__attribute__’
       __attribute__((unused))
       ^
prog.cpp:14:7: error: expected ‘;’ before ‘__attribute__’
prog.cpp:2:5: warning: label ‘A’ defined but not used [-Wunused-label]
     A:
     ^
prog.cpp:12:5: warning: label ‘D’ defined but not used [-Wunused-label]
     D:
     ^

So I've created a new patch that I believe has the correct behavior.
If there's a semi-colon, the attributes are applied to the label.  If
there's a declaration, it is handled.  Any other form of statement
causes a specific error.

Thanks!

~Aaron
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Latest LabelAttr.patch
Type: application/octet-stream
Size: 3379 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20131030/f32288fd/attachment.obj>


More information about the cfe-commits mailing list