aaron.ballman added inline comments.

================
Comment at: clang/lib/Sema/SemaDeclAttr.cpp:6454
 
+static bool validateLikelihoodAttr(Sema &S, Decl *D, const ParsedAttr &A) {
+  if (!isa<LabelDecl>(D)) {
----------------
Mordante wrote:
> aaron.ballman wrote:
> > This is entering into somewhat novel territory for attributes, so some of 
> > this feedback is me thinking out loud.
> > 
> > Attr.td lists these two attributes as being a `StmtAttr` and not any kind 
> > of declaration attribute. We have `DeclOrTypeAttr` for attributes that can 
> > be applied to declarations or types, but we do not have something similar 
> > for statement attributes yet. We do have some custom semantic handling 
> > logic in SemaDeclAttr.cpp for statement attributes, but you avoid hitting 
> > that code path by adding a `case` for the two likelihood attributes. These 
> > attributes only apply to label declarations currently, and labels cannot be 
> > redeclared, so there aren't yet questions about whether this is inheritable 
> > or not. So we *might* be okay with this, but I'm not 100% certain. For 
> > instance, I don't recall if the pretty printer or AST dumpers will need to 
> > distinguish between whether this attribute is written on the statement or 
> > the declaration (which is itself a bit of an interesting question: should 
> > the attribute attach only to the statement rather than trying to attach to 
> > the underlying decl? 
> > http://eel.is/c++draft/stmt.stmt#stmt.label-1.sentence-2 is ambiguous, but 
> > I don't think of `case` or `default` labels as being declarations so I tend 
> > to not think of identifier labels as such either.). There's a part of me 
> > that wonders if we have a different issue where the attribute is trying to 
> > attach to the declaration rather than the statement and that this should be 
> > handled purely as a statement attribute.
> > 
> > I'm curious what your thoughts are, but I'd also like to see some 
> > additional tests for the random other bits that interact with attributes 
> > like AST dumping and pretty printing to be sure the behavior is reasonable.
> The labels in a switch are indeed different and the code in trunk already 
> should allow the attribute there. (I'm still busy with the CodeGen patch.)
> I agree that Standard isn't clear whether the attribute is attached to the 
> statement or the declaration.
> 
> The `LabelDecl` expects a pointer to a `LabelStmt` and not to an 
> `AttributedStmt`. Since declarations can already have attributes I used that 
> feature. I just checked and the `LabelDecl` isn't shown in the AST and so the 
> attributes also aren't shown. I can adjust that.
> 
> Another option would be to change the `LabelDecl` and have two overloads of 
> `setStmt`
> `void setStmt(LabelStmt *T) { TheStmt = T; }`
> `void setStmt(AttributedStmt *T) { TheStmt = T; }`
> Then `TheStmt` needs to be a `Stmt` and an extra getter would be required to 
> get the generic statement.
> 
> I think both solutions aren't trivial changes. Currently the attribute has no 
> effect on labels so it not being visible isn't a real issue. However I feel 
> that's not a proper solution. I expect attributes will be used more in C and 
> C++ in the future. For example, I can imagine a `[[cold]]` attribute becoming 
> available for labels.
> 
> So I'm leaning towards biting the bullet and change the implementation of 
> `LabelDecl` to allow an `AttributedStmt` instead of a `LabelStmt`.
> WDYT?
> Currently the attribute has no effect on labels so it not being visible isn't 
> a real issue. 

That's not entirely true though -- we have pretty printing capabilities that 
will lose the attribute when written on a label, so round-tripping through the 
pretty printer will fail. But we have quite a few issues with pretty printing 
attributes as it stands, so I'm not super concerned either.

> So I'm leaning towards biting the bullet and change the implementation of 
> LabelDecl to allow an AttributedStmt instead of a LabelStmt.
> WDYT?

I'm curious if @rsmith feels the same way, but I think something along those 
lines makes sense (if not an overload, perhaps a templated function with 
SFINAE). We'd have to make sure that the attributed statement eventually 
resolves to a `LabelStmt` once we strip the attributes away, but this would 
keep the attribute at the statement level rather than making it a declaration 
one, which I think is more along the lines of what's intended for the 
likelihood attributes (and probably for hot/cold if we add that support later).


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

https://reviews.llvm.org/D86559

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

Reply via email to