https://github.com/jpjepko created
https://github.com/llvm/llvm-project/pull/179790
Running the following code with `-Wattributes` triggers no warnings:
```cpp
int main(__attribute__((unused)) int argc, __attribute__((unused)) char **argv)
{
return argc;
}
```
```
$ clang -Wall -Wattributes main.cpp
[no output]
```
But `-Wused-but-marked-unused` does warn (currently disabled by default):
```
$ clang -Wall -Wused-but-marked-unused main.cpp
/tmp/main.c:4:10: warning: 'argc' was marked unused but was used
[-Wused-but-marked-unused]
4 | return argc;
| ^
1 warning generated.
```
This warning was disabled by default and removed from `-Wunused` in 2010 due to
concerns about false-positives, as the `unused` attribute was traditionally
interpreted as "it's okay if this isn't used" rather than "this must not be
used" (paraphrased from
https://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20101018/035732.html).
However, now that we have the `maybe_unused` attribute with explicit "may or
may not be used" semantics, I would contend `unused` should have a stricter
definition of "should not be used." Warning on variables marked `unused` that
are actually used would improve code quality without the original
false-positive concerns, since programmers should prefer `maybe_unused` in
those cases.
Here I propose simply adding it to `-Wattributes`, which leaves it out of
`-Wall`, but enables it alongside other attribute-related warnings. Thoughts?
>From a402efdefed48cbe72282969de52d44946c26b7d Mon Sep 17 00:00:00 2001
From: John Jepko <[email protected]>
Date: Wed, 4 Feb 2026 17:41:24 +0100
Subject: [PATCH] add Wused-but-marked-unused to Wattributes
---
clang/include/clang/Basic/DiagnosticGroups.td | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/clang/include/clang/Basic/DiagnosticGroups.td
b/clang/include/clang/Basic/DiagnosticGroups.td
index 488f3a94c4fb6..cf2bc00cc2e21 100644
--- a/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/clang/include/clang/Basic/DiagnosticGroups.td
@@ -1010,8 +1010,9 @@ def IndependentClassAttribute :
DiagGroup<"IndependentClass-attribute">;
def UnknownAttributes : DiagGroup<"unknown-attributes">;
def IgnoredAttributes : DiagGroup<"ignored-attributes",
[DllexportExplicitInstantiation]>;
-def Attributes : DiagGroup<"attributes", [UnknownAttributes,
- IgnoredAttributes]>;
+def UsedButMarkedUnused : DiagGroup<"used-but-marked-unused">;
+def Attributes : DiagGroup<"attributes", [UnknownAttributes, IgnoredAttributes,
+ UsedButMarkedUnused]>;
def UnknownSanitizers : DiagGroup<"unknown-sanitizers">;
def UnnamedTypeTemplateArgs : DiagGroup<"unnamed-type-template-args",
[CXX98CompatUnnamedTypeTemplateArgs]>;
@@ -1047,7 +1048,6 @@ def UnusedButSetVariable :
DiagGroup<"unused-but-set-variable">;
def UnusedLocalTypedef : DiagGroup<"unused-local-typedef">;
def UnusedPropertyIvar : DiagGroup<"unused-property-ivar">;
def UnusedGetterReturnValue : DiagGroup<"unused-getter-return-value">;
-def UsedButMarkedUnused : DiagGroup<"used-but-marked-unused">;
def UsedSearchPath : DiagGroup<"search-path-usage">;
def UserDefinedLiterals : DiagGroup<"user-defined-literals">;
def UserDefinedWarnings : DiagGroup<"user-defined-warnings">;
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits