[clang] [clang] improve suggested attribute location for scoped enums (PR #124122)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Jan 23 06:41:00 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Carson Radtke (carsonRadtke)
<details>
<summary>Changes</summary>
Attribute locations for scoped enums should appear immediately after 'class' or 'struct'.
Consider a user trying to add attributes to a scoped enum declaration:
```c++
[[attr]] enum class X { A };
```
The attribute is in the incorrect location and clang ([before this change](https://godbolt.org/z/9GjfWc5Tf)) suggests putting it after 'enum'. This is incorrect for scoped enum as the attribute must following 'class'.
After this change, the warning looks like:
```
$ ./bin/clang -c -std=c++20 ../repro.cpp
../repro.cpp:1:20: error: misplaced attributes; expected attributes here
1 | [[attr]] enum class E { A };
| ~~~~~~~~ ^
| [[attr]]
1 error generated.
```
---
Full diff: https://github.com/llvm/llvm-project/pull/124122.diff
1 Files Affected:
- (modified) clang/lib/Parse/Parser.cpp (+10-1)
``````````diff
diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp
index 0710542f5e938e..4c5bcbd8df6bb5 100644
--- a/clang/lib/Parse/Parser.cpp
+++ b/clang/lib/Parse/Parser.cpp
@@ -1175,12 +1175,21 @@ Parser::DeclGroupPtrTy Parser::ParseDeclOrFunctionDefInternal(
}
};
- // Suggest correct location to fix '[[attrib]] struct' to 'struct [[attrib]]'
+ // Suggest correct location to fix '[[attrib]] struct' to 'struct [[attrib]]'...
SourceLocation CorrectLocationForAttributes =
DeclSpec::isDeclRep(DS.getTypeSpecType())
? DS.getTypeSpecTypeLoc().getLocWithOffset(
LengthOfTSTToken(DS.getTypeSpecType()))
: SourceLocation();
+ // ... suggested location should be after 'class/struct' for scoped enums
+ if (DS.getTypeSpecType() == DeclSpec::TST_enum) {
+ const EnumDecl *ED = cast<EnumDecl>(DS.getRepAsDecl());
+ if (ED->isScoped()) {
+ // FIXME: offset is dependent on number of spaces after 'enum'
+ CorrectLocationForAttributes =
+ CorrectLocationForAttributes.getLocWithOffset(6);
+ }
+ }
ProhibitAttributes(Attrs, CorrectLocationForAttributes);
ConsumeToken();
RecordDecl *AnonRecord = nullptr;
``````````
</details>
https://github.com/llvm/llvm-project/pull/124122
More information about the cfe-commits
mailing list