[clang] [Clang] Improve diagnostics to show the correct position for `[[maybe_unused]]` before a using-alias (PR #223910)
Alexsander Borges Damaceno via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 17 00:06:49 PDT 2026
https://github.com/AlexsanderDamaceno updated https://github.com/llvm/llvm-project/pull/223910
>From a958c3812a94b797e89c088731eba91eb2d320ce Mon Sep 17 00:00:00 2001
From: AlexsanderDamaceno <aemgbo at gmail.com>
Date: Wed, 16 Sep 2026 01:04:36 -0300
Subject: [PATCH] For [[maybe_unused]] written before the 'using' keyword of an
alias-declaration:
[[maybe_unused]] using T = int;
Clang currently reports only:
error: an attribute list cannot appear here
with no indication of where the attribute should actually go
Parser::DiagnoseProhibitedAttributes already provides exactly this behavior,
emitting a more helpful fix-it that suggests moving the attribute to the correct location.
ParseUsingDeclaration already uses it without pass the FixItLoc
location this way the fix-it sugestion is not show for using decl.
This patch passes the right location when the attribute is [[maybe_unused]], making the fix-it appear for the user.
Improvement suggestion link: #155787
---
clang/docs/ReleaseNotes.md | 3 +++
clang/lib/Parse/ParseDeclCXX.cpp | 2 +-
clang/test/Parser/cxx0x-attributes.cpp | 6 +++++-
clang/test/Parser/cxx0x-keyword-attributes.cpp | 2 +-
4 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index 9063e54b3e692..558dc191a4ffb 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -758,6 +758,9 @@ latest release, please see the [Clang Web Site](https://clang.llvm.org) or the
- Fixed missing sentinel attribute diagnostic discrepancy with explicit object
parameters in variadic functions. (#GH200007)
+- Suggests the correct location for an attribute written before the `using`
+ keyword of an alias-declaration. (#GH155787)
+
### Improvements to Clang's time-trace
### Improvements to Coverage Mapping
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index 893989bd2398f..597078686e815 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -749,7 +749,7 @@ Parser::DeclGroupPtrTy Parser::ParseUsingDeclaration(
return nullptr;
}
- ProhibitAttributes(PrefixAttrs);
+ ProhibitAttributes(PrefixAttrs, Tok.getLocation());
Decl *DeclFromDeclSpec = nullptr;
Scope *CurScope = getCurScope();
diff --git a/clang/test/Parser/cxx0x-attributes.cpp b/clang/test/Parser/cxx0x-attributes.cpp
index 220fddb98127a..a2fb69fa3270d 100644
--- a/clang/test/Parser/cxx0x-attributes.cpp
+++ b/clang/test/Parser/cxx0x-attributes.cpp
@@ -181,7 +181,7 @@ void bad_attributes_in_do_while() {
// expected-error at -1 {{expected ';' after do/while}}
} // expected-error 2{{expected ')'}} expected-error {{expected expression}}
-[[]] using T = int; // expected-error {{an attribute list cannot appear here}}
+[[]] using T = int; // expected-error {{misplaced attributes; expected attributes here}}
using T [[]] = int; // ok
template<typename T> using U [[]] = T;
using ns::i [[]];
@@ -200,6 +200,10 @@ using T [[noreturn]] = int; // expected-error {{'noreturn' attribute only applie
using V = int; // expected-note {{previous}}
using V [[gnu::vector_size(16)]] = int; // expected-error {{redefinition with different types}}
+void using_alias_in_block() {
+ [[maybe_unused]] using BlockAlias = int; // expected-error {{misplaced attributes; expected attributes here}}
+}
+
auto trailing() -> [[]] const int; // expected-error {{an attribute list cannot appear here}}
auto trailing() -> const [[]] int; // expected-error {{an attribute list cannot appear here}}
auto trailing() -> const int [[]];
diff --git a/clang/test/Parser/cxx0x-keyword-attributes.cpp b/clang/test/Parser/cxx0x-keyword-attributes.cpp
index e044336eb1792..72e2a90195ee1 100644
--- a/clang/test/Parser/cxx0x-keyword-attributes.cpp
+++ b/clang/test/Parser/cxx0x-keyword-attributes.cpp
@@ -139,7 +139,7 @@ using ATTR_USE alignas(4) ATTR_USE foobar = int; // expected-error {{'ATTR_NAME'
expected-error {{'alignas' attribute only applies to}} \
expected-error 2 {{'ATTR_NAME' only applies to function types}}
-ATTR_USE using T = int; // expected-error {{'ATTR_NAME' cannot appear here}}
+ATTR_USE using T = int; // expected-error {{misplaced 'ATTR_NAME'; expected 'ATTR_NAME' here}}
using T ATTR_USE = int; // expected-error {{'ATTR_NAME' only applies to function types}}
template<typename T> using U ATTR_USE = T; // expected-error {{'ATTR_NAME' only applies to function types}}
using ns::i ATTR_USE; // expected-warning {{ISO C++}} \
More information about the cfe-commits
mailing list