================
@@ -2379,6 +2382,11 @@ StmtResult Parser::ParseForStatement(SourceLocation 
*TrailingElseLoc,
       return StmtError();
     }
 
+    // attribute-specifier without attribute (`[[]]`) isn't in AST.
+    // `__declspec()` is only applied to declarations, so we can ignore it.
+    if (!isa<CompoundStmt>(Body.get()) || BodyStartsWithAttr)
----------------
AaronBallman wrote:

Whelp, I think this logic is correct but I really don't agree with the design 
in the standard and think there's another extension hiding in here:
```
int main() {
  template for (int x : {1}) [[clang::atomic(remote_memory)]] {}
}
```
That's invalid per the standard because the standard requires a 
compound-statement and that grammar production cannot have a leading attribute. 
If WG21 used statement instead, then a leading attribute would be accepted as 
you'd expect.

I think the diagnostic text will be confusing in that situation because there 
*is* a compound statement. That suggests we want to handle attributes with 
their own diagnostic, but that would mean we'd need to get much better about 
recognizing attributes instead of looking for a single token.

Ideally, we'd have a `CompoundStmt` or an `AttributedStmt` which wraps a 
`CompoundStmt`, but there are two scenarios I think that won't cover:
```
template for (int x : {1}) [[]] { } // Empty attributes don't make an 
AttributedStmt
template for (int x : {1}) [[unknown]] {} // Unknown attributes don't make an 
AttributedStmt either
```
Other test cases to consider would be Objective-C++ or lambdas in C++, so it's 
not just attributes:
```
template for (int x : {1}) [obj msg];
template for (int x : {1}) [](){}();
```


https://github.com/llvm/llvm-project/pull/209229
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to