https://github.com/JOE1994 created https://github.com/llvm/llvm-project/pull/87348
Fixes #41447 >From 90834d7250d18c9389c84966279365638dce80a9 Mon Sep 17 00:00:00 2001 From: Youngsuk Kim <youngsuk....@hpe.com> Date: Tue, 2 Apr 2024 08:17:36 -0500 Subject: [PATCH] [Clang][Sema] Warn unused cxx var declared in condition of if-statement --- clang/include/clang/AST/Decl.h | 12 ++++++++++++ clang/lib/Sema/SemaDecl.cpp | 8 ++++++-- clang/lib/Sema/SemaDeclCXX.cpp | 3 +++ .../SemaCXX/warn-unused-but-set-variables-cpp.cpp | 6 ++++++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h index a5879591f4c659..5f1f83bb00282f 100644 --- a/clang/include/clang/AST/Decl.h +++ b/clang/include/clang/AST/Decl.h @@ -1100,6 +1100,9 @@ class VarDecl : public DeclaratorDecl, public Redeclarable<VarDecl> { LLVM_PREFERRED_TYPE(bool) unsigned EscapingByref : 1; + + LLVM_PREFERRED_TYPE(bool) + unsigned IsCXXCondDecl : 1; }; union { @@ -1589,6 +1592,15 @@ class VarDecl : public DeclaratorDecl, public Redeclarable<VarDecl> { NonParmVarDeclBits.EscapingByref = true; } + bool isCXXCondDecl() const { + return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.IsCXXCondDecl; + } + + void setCXXCondDecl() { + assert(!isa<ParmVarDecl>(this)); + NonParmVarDeclBits.IsCXXCondDecl = true; + } + /// Determines if this variable's alignment is dependent. bool hasDependentAlignment() const; diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 8b44d24f5273aa..62f71658fa3b5a 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -2188,8 +2188,12 @@ void Sema::DiagnoseUnusedButSetDecl(const VarDecl *VD, assert(iter->getSecond() >= 0 && "Found a negative number of references to a VarDecl"); - if (iter->getSecond() != 0) - return; + if (iter->getSecond() != 0) { + bool UnusedCXXCondDecl = VD->isCXXCondDecl() && (iter->getSecond() == 1); + if (!UnusedCXXCondDecl) + return; + } + unsigned DiagID = isa<ParmVarDecl>(VD) ? diag::warn_unused_but_set_parameter : diag::warn_unused_but_set_variable; DiagReceiver(VD->getLocation(), PDiag(DiagID) << VD); diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index e9fecaea84b021..d4d69beeba5a05 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -18563,6 +18563,9 @@ DeclResult Sema::ActOnCXXConditionDeclaration(Scope *S, Declarator &D) { return true; } + if (auto *VD = dyn_cast<VarDecl>(Dcl)) + VD->setCXXCondDecl(); + return Dcl; } diff --git a/clang/test/SemaCXX/warn-unused-but-set-variables-cpp.cpp b/clang/test/SemaCXX/warn-unused-but-set-variables-cpp.cpp index 418baa78aa964b..cb066e209cb453 100644 --- a/clang/test/SemaCXX/warn-unused-but-set-variables-cpp.cpp +++ b/clang/test/SemaCXX/warn-unused-but-set-variables-cpp.cpp @@ -69,3 +69,9 @@ template <typename T> void f5() { SWarnUnused swu; ++swu; } + +void f6() { + if (int x = 123) { // expected-warning{{variable 'x' set but not used}} + ; + } +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits