Mordante 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)) {
----------------
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?
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D86559/new/
https://reviews.llvm.org/D86559
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits