Author: Congcong Cai Date: 2025-01-08T20:56:49+08:00 New Revision: 72b6a573639fe85eb121c66e47b2c9e6ea64df5e
URL: https://github.com/llvm/llvm-project/commit/72b6a573639fe85eb121c66e47b2c9e6ea64df5e DIFF: https://github.com/llvm/llvm-project/commit/72b6a573639fe85eb121c66e47b2c9e6ea64df5e.diff LOG: [clang-tidy] fix false positives when using name-independent variables after C++26 for bugprone-unused-local-non-trivial-variable (#121783) Fixed: #121731 According to https://eel.is/c++draft/basic.scope.scope#5, name independent declaration should not be warned as unused Added: clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-local-non-trivial-variable-name-independence.cpp Modified: clang-tools-extra/clang-tidy/bugprone/UnusedLocalNonTrivialVariableCheck.cpp clang-tools-extra/docs/ReleaseNotes.rst clang-tools-extra/docs/clang-tidy/checks/bugprone/unused-local-non-trivial-variable.rst Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/bugprone/UnusedLocalNonTrivialVariableCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/UnusedLocalNonTrivialVariableCheck.cpp index 37baae7a6f0c3a..f15fd4d9ad9fab 100644 --- a/clang-tools-extra/clang-tidy/bugprone/UnusedLocalNonTrivialVariableCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/UnusedLocalNonTrivialVariableCheck.cpp @@ -29,6 +29,12 @@ static constexpr StringRef DefaultIncludeTypeRegex = AST_MATCHER(VarDecl, isLocalVarDecl) { return Node.isLocalVarDecl(); } AST_MATCHER(VarDecl, isReferenced) { return Node.isReferenced(); } +AST_MATCHER_P(VarDecl, explicitMarkUnused, LangOptions, LangOpts) { + // Implementations should not emit a warning that a name-independent + // declaration is used or unused. + return Node.hasAttr<UnusedAttr>() || + (LangOpts.CPlusPlus26 && Node.isPlaceholderVar(LangOpts)); +} AST_MATCHER(Type, isReferenceType) { return Node.isReferenceType(); } AST_MATCHER(QualType, isTrivial) { return Node.isTrivialType(Finder->getASTContext()) || @@ -60,7 +66,7 @@ void UnusedLocalNonTrivialVariableCheck::registerMatchers(MatchFinder *Finder) { varDecl(isLocalVarDecl(), unless(isReferenced()), unless(isExceptionVariable()), hasLocalStorage(), isDefinition(), unless(hasType(isReferenceType())), unless(hasType(isTrivial())), - unless(hasAttr(attr::Kind::Unused)), + unless(explicitMarkUnused(getLangOpts())), hasType(hasUnqualifiedDesugaredType( anyOf(recordType(hasDeclaration(namedDecl( matchesAnyListedName(IncludeTypes), diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 35cb3e387e4e64..94e15639c4a92e 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -241,6 +241,10 @@ Changes in existing checks <clang-tidy/checks/bugprone/unsafe-functions>` check to allow specifying additional functions to match. +- Improved :doc:`bugprone-unused-local-non-trivial-variable + <clang-tidy/checks/bugprone/unused-local-non-trivial-variable>` check to avoid + false positives when using name-independent variables after C++26. + - Improved :doc:`bugprone-use-after-move <clang-tidy/checks/bugprone/use-after-move>` to avoid triggering on ``reset()`` calls on moved-from ``std::optional`` and ``std::any`` objects, diff --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone/unused-local-non-trivial-variable.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone/unused-local-non-trivial-variable.rst index 9f283de78fbdec..672eab62b4af63 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/bugprone/unused-local-non-trivial-variable.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone/unused-local-non-trivial-variable.rst @@ -12,6 +12,7 @@ The following types of variables are excluded from this check: * static or thread local * structured bindings * variables with ``[[maybe_unused]]`` attribute +* name-independent variables This check can be configured to warn on all non-trivial variables by setting `IncludeTypes` to `.*`, and excluding specific types using `ExcludeTypes`. diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-local-non-trivial-variable-name-independence.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-local-non-trivial-variable-name-independence.cpp new file mode 100644 index 00000000000000..bcc8b810acabf5 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-local-non-trivial-variable-name-independence.cpp @@ -0,0 +1,21 @@ +// RUN: %check_clang_tidy -std=c++23 -check-suffixes=,CXX23 %s bugprone-unused-local-non-trivial-variable %t -- \ +// RUN: -config="{CheckOptions: {bugprone-unused-local-non-trivial-variable.IncludeTypes: '::async::Foo'}}" \ +// RUN: -- +// RUN: %check_clang_tidy -std=c++26 %s bugprone-unused-local-non-trivial-variable %t -- \ +// RUN: -config="{CheckOptions: {bugprone-unused-local-non-trivial-variable.IncludeTypes: '::async::Foo'}}" \ +// RUN: -- + +namespace async { +class Foo { + public: + ~Foo(); + private: +}; +} // namespace async + +void check() { + async::Foo C; + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: unused local variable 'C' of type 'async::Foo' [bugprone-unused-local-non-trivial-variable] + async::Foo _; + // CHECK-MESSAGES-CXX23: :[[@LINE-1]]:14: warning: unused local variable '_' of type 'async::Foo' [bugprone-unused-local-non-trivial-variable] +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits