rsandifo-arm added inline comments.

================
Comment at: clang/include/clang/Basic/DiagnosticSemaKinds.td:2000
   "overridden virtual function is here">;
+def err_conflicting_overriding_attributes : Error<
+  "virtual function %0 has different attributes "
----------------
rsandifo-arm wrote:
> aaron.ballman wrote:
> > aaron.ballman wrote:
> > > rsandifo-arm wrote:
> > > > sdesmalen wrote:
> > > > > aaron.ballman wrote:
> > > > > > sdesmalen wrote:
> > > > > > > aaron.ballman wrote:
> > > > > > > > This error and the one below make me wonder whether an 
> > > > > > > > attribute spelling is the appropriate way to surface this 
> > > > > > > > functionality as opposed to a keyword. Attributes don't 
> > > > > > > > typically don't cause errors in these situations, but because 
> > > > > > > > these attributes are strongly coupled to their type system 
> > > > > > > > effects I can see why you want these to be errors.
> > > > > > > > This error and the one below make me wonder whether an 
> > > > > > > > attribute spelling is the appropriate way to surface this 
> > > > > > > > functionality as opposed to a keyword. 
> > > > > > > I'm not sure I understand what you mean, do you have an example?
> > > > > > `override` and `final` could have been surfaced via attributes, and 
> > > > > > in Clang we semantically express them as such (see `Final` and 
> > > > > > `Override` in Attr.td), but instead they are surfaced to the user 
> > > > > > as keywords in the language standard. You're not under the same 
> > > > > > constraints as the standard (you're making a vendor-specific 
> > > > > > attribute). We're not super consistent with whether we use the same 
> > > > > > approach as the standard (we have some type attributes that are 
> > > > > > spelled as attributes like `vector_size` and others that are 
> > > > > > spelled via keywords like `_Nullable`.
> > > > > > 
> > > > > > So you could spell your type attributes the way you have been with 
> > > > > > `__attribute__`, or you could come up with keywords for them (so 
> > > > > > instead of using `GNU<"whatever">` for the attribute, you could use 
> > > > > > `Keyword<_Whatever>` or `Keyword<__whatever>` (you'd also need to 
> > > > > > add them as recognized keyword tokens, parse them as appropriate, 
> > > > > > etc).
> > > > > > 
> > > > > > Note: I don't insist on you using a keyword for these, but I am 
> > > > > > wondering if that approach was considered or not given how 
> > > > > > non-portable the attributes are (if an implementation ignores this 
> > > > > > attribute, it sounds like the program semantics are unlikely to be 
> > > > > > correct).
> > > > > @rsandifo-arm can you shed some light on whether using a keyword 
> > > > > instead of an `attribute` was considered?
> > > > Thanks @aaron.ballman for the reviews.
> > > >  
> > > > Yeah, we did consider using keywords instead.  The main reason for 
> > > > sticking with GNU attributes is that they were specifically designed as 
> > > > an extensible way of attaching information or requirements to the 
> > > > source code, and they provide well-settled semantics.  It seemed better 
> > > > to reuse an existing mechanism rather than invent something new.
> > > > 
> > > > Also, as C++ evolves, the semantics of GNU attributes evolve to match.  
> > > > If we surface the SME features as GNU attributes, we inherit this 
> > > > development in the underlying semantics, without having to maintain our 
> > > > own evolving specification for where the keywords can be placed.  For 
> > > > example, when lambdas were introduced, GNU attributes were extended to 
> > > > support lambdas.  Something similar could happen in future.
> > > > 
> > > > We could have defined the semantics of the keywords to be that they 
> > > > behave exactly like GNU attributes.  However:
> > > > 
> > > > # If we do that, the advantage of using a keyword is less obvious.  (I 
> > > > can see the argument that the syntax looks nicer though.)
> > > > # Like you say in the review, the semantics of GNU attributes carry 
> > > > some historical baggage.  If would be difficult to justify keeping that 
> > > > historical baggage for something that is ostensibly new and not a GNU 
> > > > attribute as such.
> > > > 
> > > > A minor, but still nontrivial, reason is that there is less appetite in 
> > > > the GCC community for supporting target-specific extensions to the core 
> > > > language.  Adding a target-specific keyword is likely to be rejected.  
> > > > It would be acceptable to make the “keyword” be a predefined macro that 
> > > > expands to a GNU attribute under the hood, but I don't think that would 
> > > > address the core issue.
> > > > 
> > > > I can definitely understand the unease about using attributes for 
> > > > things that affect semantics.  Like you say, that's going against a 
> > > > core principle of the standard-defined attributes.  But I think in a 
> > > > way, it's unfortunate that GNU-style attributes and standard-defined 
> > > > attributes are both called “attributes”, because I don't think there's 
> > > > a prohibition (even in theory) against GNU attributes affecting 
> > > > semantics.  I think GNU attributes are designed to be more general than 
> > > > that, probably through historical accretion rather than an up-front 
> > > > choice.
> > > > 
> > > > Like you say, `vector_size` is one example of something that 
> > > > significantly affect semantics.  But there are quite a few others too.  
> > > > For example:
> > > > * GNU targets traditionally provide access to naked functions and 
> > > > interrupt handlers through attributes.
> > > > * Different calling conventions also use attributes.
> > > > * The `target` attribute switches between ISAs in ways that do affect 
> > > > semantics.
> > > > * `always_inline` functions must be inlined for correctness.
> > > > * `weak` and `visibility` in effect alter the ODR.
> > > > * In GCC, functions that return twice (like `setjmp`) must be declared 
> > > > `returns_twice`.
> > > > 
> > > > It's unfortunate that using SME attributes will only trigger a warning 
> > > > in older compilers.  The warning is enabled by default though.  And in 
> > > > practice, I think most SME code would rely on other constructs that 
> > > > older compilers wouldn't provide, such as intrinsics.
> > > > Yeah, we did consider using keywords instead. The main reason for 
> > > > sticking with GNU attributes is that they were specifically designed as 
> > > > an extensible way of attaching information or requirements to the 
> > > > source code, and they provide well-settled semantics. It seemed better 
> > > > to reuse an existing mechanism rather than invent something new.
> > > 
> > > If this is extra information the compiler is free to ignore without 
> > > impacting program correctness, then I think an attribute is fine. But if 
> > > the user's code will silently break if the attribute is ignored (e.g., an 
> > > attribute ignored warning happens but the program successfully translates 
> > > and does bad things at runtime), in some ways use of an attribute is far 
> > > less ideal than use of a keyword-based attribute specifically because of 
> > > the syntax error the user would get. Some users really like the "unknown 
> > > attribute ignored" warning (like me!) and ensure it stays enabled and 
> > > others users really don't like that warning and disable it. So it's 
> > > dangerous to assume there's anything there worth relying on if the 
> > > attributes have security implications at runtime.
> > > 
> > > > Also, as C++ evolves, the semantics of GNU attributes evolve to match. 
> > > 
> > > Errr does it? 
> > > https://gcc.gnu.org/onlinedocs/gcc/extensions-to-the-c-language-family/attribute-syntax.html#attribute-syntax
> > >  "There are some problems with the semantics of attributes in C++. For 
> > > example, there are no manglings for attributes, although they may affect 
> > > code generation, so problems may arise when attributed types are used in 
> > > conjunction with templates or overloading. Similarly, typeid does not 
> > > distinguish between types with different attributes. Support for 
> > > attributes in C++ may be restricted in future to attributes on 
> > > declarations only, but not on nested declarators." doesn't really seem to 
> > > support that position.
> > > 
> > > > A minor, but still nontrivial, reason is that there is less appetite in 
> > > > the GCC community for supporting target-specific extensions to the core 
> > > > language. 
> > > 
> > > That's unfortunate given that `_Keywords` are reserved to the 
> > > implementation specifically for this sort of thing. `_Nullable` is a good 
> > > example of a successful attribute keyword. Attributes are a 
> > > target-specific extension to the core language regardless of what syntax 
> > > they use, so to me the driving question is more "what user experience do 
> > > you want?" and less "is this an extension to the core language?"
> > Re-pinging this part of the thread -- the more I review this, the more it 
> > sounds like ignoring these attributes will cause a significant likelihood 
> > of the user's program silently misbehaving. Is that accurate? If so, I 
> > would reconsider whether using a keyword gives a more appropriate user 
> > experience for portability. With an attribute, the user has a very real 
> > chance of their code continuing to compile but not work. With a keyword, 
> > the user will get errors when porting to a compiler that doesn't support 
> > the keyword and are more protected from miscompiles. We can still reuse the 
> > vast majority of the implementation work already done here, so it should 
> > not be a major change to the implementation (a bit of extra parsing work 
> > for the keywords is really the only thing missing).
> I accept your points about the dangers of ignoring unsupported attributes.  
> But this isn't an SME-specific issue.  Ignoring the other GNU attributes I 
> mentioned would also silently generate wrong code.  I think this is a very 
> strong argument against suppressing warnings about unrecognised GNU 
> attributes by default, even if warnings about unrecognised standard 
> attributes are eventually suppressed by default.  (Perhaps they should even 
> be controllable separately?)  Like I say, there doesn't seem to have been a 
> principle that GNU attributes provide information that the compiler is free 
> to ignore.
> 
> If we did add keywords, would you be OK with giving them exactly the same 
> semantics as GNU attributes?  In other words, would it be acceptable to treat 
> the keywords as essentially a one-for-one parsing replacement for GNU 
> attributes?  Or would you want the keyword to follow the same distinction 
> between type properties and object properties as the standard attributes do?
> Or would you want the keyword to follow the same distinction between type 
> properties and object properties as the standard attributes do?
That was a vague question, sorry.  What I meant is whether the correct position 
of the keyword should vary based on whether it describes a property of the 
function type vs. a property of the function definition, or whether we can 
maintain the laxity in the GNU attribute positioning.  I think the laxity in 
the GNU attribute positioning is helpful to users, and in this case wouldn't 
introduce any ambiguity.

From discussions I've had with people who will write/are writing SME code, the 
distinction between `arm_locally_streamng` being a property of the definition 
and `arm_streaming` being a property of the type seems contrived to them, 
especially when the usage of SME is private to a single translation unit.

Treating the keyword as an error-generating GNU attribute stand-in would also 
allow implementations to make the keyword as a preprocessor macro, if they need 
to.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D127762/new/

https://reviews.llvm.org/D127762

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

Reply via email to