rjmccall added inline comments.

================
Comment at: include/clang/Basic/Attr.td:239
+  bit IncludeC = includeC;
+}
 
----------------
aaron.ballman wrote:
> rjmccall wrote:
> > aaron.ballman wrote:
> > > rjmccall wrote:
> > > > aaron.ballman wrote:
> > > > > rjmccall wrote:
> > > > > > I have no objection to allowing ObjC attributes to be spelled in 
> > > > > > [[clang::objc_whatever]] style.  We can debate giving them a more 
> > > > > > appropriate standard name in the objc namespace at a later time — 
> > > > > > or even the primary namespace, if we really want to flex our 
> > > > > > Somewhat Major Language muscles.
> > > > > > 
> > > > > > I feel like this IncludeC is not the best name for this tablegen 
> > > > > > property.  Perhaps AllowInC?
> > > > > > 
> > > > > > Also, a random positional 1 argument is pretty obscure TableGen 
> > > > > > design.  Do we really expect to be making very many attributes that 
> > > > > > intentionally disallow C2x?  What would these be, just C++-specific 
> > > > > > attributes without C analogues?  It doesn't seem important to 
> > > > > > prohibit those at the parsing level rather than at the semantic 
> > > > > > level, since, after all, we are still allowing the GNU-style 
> > > > > > spelling, and these would still qualified with ``clang::``.
> > > > > > 
> > > > > > I would suggest standardizing in the opposite direction:  instead 
> > > > > > of forcing attributes to opt in to being allowed in C, we should 
> > > > > > make attributes that we really don't want to allow in the C2x 
> > > > > > [[clang::]] namespace be explicit about it.  If there are a lot of 
> > > > > > C++-specific attributes like that, we can make a ClangCXXOnly 
> > > > > > subclass.
> > > > > > I have no objection to allowing ObjC attributes to be spelled in 
> > > > > > [[clang::objc_whatever]] style. We can debate giving them a more 
> > > > > > appropriate standard name in the objc namespace at a later time — 
> > > > > > or even the primary namespace, if we really want to flex our 
> > > > > > Somewhat Major Language muscles.
> > > > > 
> > > > > Thanks -- are you okay with where the attributes are allowed in the 
> > > > > syntax? I tried to follow the position they're allowed in C and C++ 
> > > > > as closely as I could, but having confirmation would be nice.
> > > > > 
> > > > > As for putting the attributes in the primary namespace, that would be 
> > > > > reasonable for using the attributes in ObjC or ObjC++ but not so much 
> > > > > for using the same attributes in a pure C or C++ compilation.
> > > > > 
> > > > > > I feel like this IncludeC is not the best name for this tablegen 
> > > > > > property. Perhaps AllowInC?
> > > > > 
> > > > > I'm fine with that name. I'll change it in D41317 when I commit that.
> > > > > 
> > > > > > Also, a random positional 1 argument is pretty obscure TableGen 
> > > > > > design. Do we really expect to be making very many attributes that 
> > > > > > intentionally disallow C2x? What would these be, just C++-specific 
> > > > > > attributes without C analogues? 
> > > > > 
> > > > > I agree -- I was toying with using a named entity rather than a 
> > > > > numeric literal, but I wanted to see how the design shook out in 
> > > > > practice once I had a better feel for how many attributes are 
> > > > > impacted. I'm glad you recommend going the opposite direction as that 
> > > > > was my ultimate goal. :-) Basically, my initial approach is to 
> > > > > disallow everything in C and then start enabling the attributes that 
> > > > > make sense. At some point, I believe we'll have more attributes in 
> > > > > both language modes than not, and then I plan to reverse the meaning 
> > > > > of the flag so that an attribute has to opt-out rather than opt-in. I 
> > > > > don't expect we'll have many attributes that are disallowed in C2x. I 
> > > > > think they'll fall into two categories: C++ attributes that don't 
> > > > > make sense in C and attributes that are governed by some other body.
> > > > > 
> > > > > > It doesn't seem important to prohibit those at the parsing level 
> > > > > > rather than at the semantic level, since, after all, we are still 
> > > > > > allowing the GNU-style spelling, and these would still qualified 
> > > > > > with `clang::`.
> > > > > 
> > > > > I think it's important for C targets when 
> > > > > `-fdouble-square-bracket-attributes` is not enabled, as the 
> > > > > attributes cannot syntactically appear in those positions.
> > > > > 
> > > > > > I would suggest standardizing in the opposite direction
> > > > > 
> > > > > I suspect I will ultimately get there. I chose this approach to be 
> > > > > more conservative about what we expose.
> > > > > Thanks -- are you okay with where the attributes are allowed in the 
> > > > > syntax? I tried to follow the position they're allowed in C and C++ 
> > > > > as closely as I could, but having confirmation would be nice.
> > > > 
> > > > I'll leave comments on the various places.  For the most part, no, I 
> > > > think these are the wrong places; where we allow attributes in ObjC is 
> > > > actually pretty carefully thought-out already, and it's better to 
> > > > follow the places where we parse GNU attributes than to try to imitate 
> > > > the C grammar.
> > > > 
> > > > > As for putting the attributes in the primary namespace, that would be 
> > > > > reasonable for using the attributes in ObjC or ObjC++ but not so much 
> > > > > for using the same attributes in a pure C or C++ compilation.
> > > > 
> > > > Yes, please ignore that.  I was just idly thinking about what we would 
> > > > do if we were adopting this feature as a more standard thing, i.e. 
> > > > leaving the implementation namespace.  I think we'd want to rename some 
> > > > of the attributes for consistency, and then I think we'd just put them 
> > > > in the objc:: namespace.  None of this affects what we're doing now.
> > > > 
> > > > > I think it's important for C targets when 
> > > > > -fdouble-square-bracket-attributes is not enabled, as the attributes 
> > > > > cannot syntactically appear in those positions.
> > > > 
> > > > Okay, that's fair.
> > > > 
> > > > > I suspect I will ultimately get there. I chose this approach to be 
> > > > > more conservative about what we expose.
> > > > 
> > > > Sure, if this is really just for staging, I won't worry about 
> > > > accidentally leaving attributes out.
> > > > I'll leave comments on the various places. For the most part, no, I 
> > > > think these are the wrong places; where we allow attributes in ObjC is 
> > > > actually pretty carefully thought-out already, and it's better to 
> > > > follow the places where we parse GNU attributes than to try to imitate 
> > > > the C grammar.
> > > 
> > > The C grammar was also carefully thought-out to consistently map the 
> > > location of the attribute syntax in source code to the entity the 
> > > attribute appertains to. The basic rule is: the attribute always 
> > > appertains to what's immediately to the left unless the attribute is at 
> > > the start of the line, in which case it applies to each declaration in 
> > > the decl group. This logic was taken from C++ attributes where it's 
> > > proven very valuable over the past seven or so years. If we follow the 
> > > GNU syntactic placement, that means this rule of thumb doesn't apply in 
> > > Objective-C and it negates one of the most powerful aspects of the 
> > > language feature: syntactic consistency (which is something GNU-style 
> > > attributes absolutely lacks, to everyone's great annoyance).
> > > 
> > > Can you explain the rationale about why the GNU-style placement is a 
> > > better approach to the C- and C++-style placement? I think that the 
> > > syntactic location of the attribute syntax should remain consistent 
> > > between ObjC constructs and C constructs because both constructs are 
> > > likely to be mixed together in the same code base. I think we hurt the 
> > > usability of the language feature by being inconsistent in this fashion 
> > > (which was one of the reasons we standardized attributes in the first 
> > > place).
> > The ObjC grammar is overall quite different from the C grammar.  There are 
> > no decl groups.  Tags like `@interface` are always declaration introducers, 
> > rather than part of the type grammar.  Types are not incidentally 
> > declared/defined in the type-specifier of a possible object or function 
> > declaration.  More subjectively, nobody looks at the primary Objective-C 
> > declarations like `@interface` or `@protocol` and thinks they look like 
> > anything else from C or C++, which means consistency is not really an issue.
> > 
> > C++ puts class attributes after the `class-key` because there's literally 
> > no other place to put attributes that wouldn't be conflated with an 
> > attribute on the object if an object were being simultaneously declared.  
> > The C grammar paints them into a corner.  We don't have that specific 
> > problem in ObjC because, as mentioned, ObjC declarations are standalone, 
> > not wedged into the object/function declaration grammar.
> > 
> > C++ seems to be inconsistent about where it allows keywords when it does 
> > have a proper declaration-introducer.  For example, the grammar for a 
> > `namespace` declaration is `'namespace' attribute-specifier-seq? 
> > identifier?`, presumably following the lead of `class`.  But the grammar 
> > for an alias declaration is `'using' identifier attribute-specifier-seq? 
> > '=' defining-type-id`, not `'using' attribute-specifier-seq? identifier '=' 
> > defining-type-id`. And of course there are the context-sensitive class 
> > attributes (e.g. `final`) that are written in a special position, which is 
> > allowable under the grammar because they only need to apply to definitions.
> > 
> > I understand that the GNU/Microsoft/Borland/whatever attribute positions 
> > often seem //ad hoc// and that the C++ committee tried to improve on that 
> > when standardizing attributes.  In contrast, I think the ObjC community is 
> > satisfied with where attributes are written in ObjC declarations today.  
> > When I said that those positions were carefully thought-out, I mean that 
> > we've already talked a lot about where attributes should go, and the 
> > current positions are the result of those conversations.  That process 
> > seems to have been a success; the only complaints I can remember ever 
> > getting about attribute parsing have been related to where C requires them, 
> > not ObjC.  In general, ObjC pushes attributes to the beginning or (in the 
> > case of methods) the end of the declaration, which people see as a good 
> > thing: attributes can get quite large, so piling them up on the fringes of 
> > the declaration ensures that they don't interfere with reading the more 
> > immediately important parts of the declaration.  While C/C++ did not have a 
> > choice about where to allow attributes on `class` declarations, objectively 
> > it is very awkward to put attributes immediately after the tag because it 
> > separates the two most important things in the declaration: the declaration 
> > introducer and the name being declared.  That is not something we want to 
> > imitate.
> > 
> > I am not just speaking for myself here.  This is where we would like the 
> > attributes to appear.
> Thank you for the helpful explanation, I appreciate it.
> 
> Do you have issue with where C is placing these attributes for constructs 
> that are supported by C, or are those also fine for use in ObjC? Basically, 
> I'm wondering whether you would want this syntax at all in ObjC, or whether 
> you're okay with the C placement for C constructs and the ObjC placement for 
> ObjC constructs?
> 
> I'm a bit concerned about this scenario and would like your thoughts:
> ```
> @interface I
> -(void)Foo;
> @end
> 
> @implementation I
> -(void)Foo [[clang::minsize]] { // OK, appertains to the function declaration
> 
> }
> 
> void bar(void) [[clang::minsize]] { // Error, minsize does not appertain to 
> the function type
> 
> }
> @end
> ```
We should just use the C rules for C constructs in ObjC mode, even if they're 
intermingled with ObjC constructs.  I see your point about the perceived 
inconsistency, but I don't see a good resolution besides acceptance.  Allowing 
new locations for C attributes would be a mistake.


https://reviews.llvm.org/D41553



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

Reply via email to