aaron.ballman added a comment.

In https://reviews.llvm.org/D37436#870305, @rsmith wrote:

> Also, your wording paper appears to allow things like
>
>   struct [[foo]] S *p; // ok in c n2137, ill-formed in c++
>   struct T {};
>   int n = sizeof(struct [[foo]] T); // ok in c n2137, ill-formed in c++
>
>
> You don't seem to implement those changes; are they bugs in the wording paper?


These are bugs in the wording paper which I think I've corrected for the 
upcoming draft (no N number yet).

> (The relevant C++ rule is [dcl.type.elab]p1: "An //attribute-specifier-seq// 
> shall not appear in an //elaborated-type-specifier// unless the latter is the 
> sole constituent of a //declaration//." Neither of the above cases is 
> prohibited by n2137's 6.7.2.1/6: "An //attribute-specifier-seq// shall not 
> appear in a //struct-or-union-specifier// of the form //struct-or-union// 
> //attribute-specifier-seq//opt //identifier// if the 
> //struct-or-union-specifier// is an incomplete type used in a 
> //parameter-declaration// or //type-name//." -- the first case is not in a 
> //parameter-declaration// or //type-name// and the second case is not an 
> incomplete type -- and no other rule seems to disallow this.)

Yeah, I recognized that after the last meeting and have modified 6.7.2.1p7 to 
be:

  7 An attribute-specifier-seq shall not appear in a struct-or-union-specifier 
without a struct-declaration-list, except in a declaration of the form:
      struct-or-union attribute-specifier-seq identifier ;
  The attributes in the attribute-specifier-seq, if any, are thereafter 
considered attributes of the struct or union whenever it is named.

I think that resolves both of your concerns, but does it resolve all similar 
concerns?



================
Comment at: include/clang/Basic/LangOptions.def:140
 
+LANGOPT(CAttributes       , 1, 0, "'[[]]' attributes extension to C")
+
----------------
rsmith wrote:
> aaron.ballman wrote:
> > rsmith wrote:
> > > Can we give this a more general name, then enable it under `CPlusPlus` 
> > > too? That's what we do for other similar features.
> > I'm not keen on naming it 'Attributes', but the other names are worse 
> > (`GeneralAttributes`, `StandardAttributes`). Do you have a suggestion?
> It's kind of long, but how about `DoubleSquareBracketAttributes`
I can't think of anything better, so I'll go with that.


================
Comment at: include/clang/Driver/Options.td:607
 
+def fc_attributes : Flag<["-"], "fc-attributes">, Group<f_Group>,
+  Flags<[DriverOption, CC1Option]>, HelpText<"Enable '[[]]' attributes in C">;
----------------
rsmith wrote:
> aaron.ballman wrote:
> > rsmith wrote:
> > > Hmm. On reflection, if we're going to have a flag to enable C++11 
> > > attributes in other language modes, it should probably work in C++98 mode 
> > > too, so calling this `-fc-attributes` is probably not the best idea. 
> > > `-fc++11-attributes` might make sense, though.
> > I can't think of a reason why you'd want to control C and C++ attributes 
> > separately, so I think it makes sense to add a more general name for this.
> > 
> > I'm definitely not keen on that flag name. I wouldn't be opposed to 
> > `-fattributes`, but that may lead to confusion about other vendor-specific 
> > attributes (which we could always decide to use flags like 
> > `-fdeclspec-attributes` etc).
> > 
> > What should happen if a user compiles with `-std=c++11 
> > -fno-<whatever>-attributes`? Do we want to support such a construct?
> I wouldn't recommend anyone actually does that, but I'd expect clang to 
> respect their wishes if they ask for it, just like we do for `-fms-extensions 
> -fno-declspec`.
Would you be okay with `-fattributes` as the flag name, or do you prefer 
`-fdouble-square-bracket-attributes`?


================
Comment at: lib/Parse/ParseDecl.cpp:4219
+
+    // Attributes are prohibited in this location in C2x (and forward
+    // declarations are prohibited in C++).
----------------
rsmith wrote:
> aaron.ballman wrote:
> > rsmith wrote:
> > > I don't think we can reasonably say what C2x will do. Also, doesn't this 
> > > reject valid code such as:
> > > ```
> > > struct __attribute__((deprecated)) Foo;
> > > ```
> > > ?
> > Sorry for the lack of context in the patch (TortoiseSVN doesn't make this 
> > easy). This has to do with enum specifiers, not struct or unions -- it will 
> > reject `enum __attribute__((deprecated)) Foo;` as not allowing an attribute 
> > list *and* as being a forward reference in C++ mode, but accepts in C mode.
> OK, but GCC accepts that with a warning in the `friend` case, and this would 
> also seem to reject valid constructs such as
> ```
> enum __attribute__((deprecated)) Foo : int;
> ```
> But... C permits neither the `TUK_Declaration` nor `TUK_Friend` cases for 
> `enum`s. The change in your wording proposal appears to be for the 
> `TUK_Reference` case instead, which you didn't change here.
Ah, okay, thank you for the help there, I'll correct (and add another test 
case, because your example is rejected when passing -fc-attributes).


https://reviews.llvm.org/D37436



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to