https://github.com/crisclacerda updated https://github.com/llvm/llvm-project/pull/227176
>From 148d88f88fe8f7ec3e0da9088c5a1b27240b3159 Mon Sep 17 00:00:00 2001 From: Cristiano Lacerda <[email protected]> Date: Mon, 28 Sep 2026 22:12:08 -0300 Subject: [PATCH] [clang][analyzer] Diagnose dead stores on parenthesized lvalues Ignore parentheses around an assignment left-hand side when identifying a local variable. This lets DeadStores diagnose an overwritten store such as (value) = input. --- .../Checkers/DeadStoresChecker.cpp | 2 +- clang/test/Analysis/dead-stores.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp index 0d693a3e3ff3dd..c68ee72a9dbda5 100644 --- a/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp @@ -325,7 +325,7 @@ class DeadStoreObs : public LiveVariables::Observer { if (const BinaryOperator* B = dyn_cast<BinaryOperator>(S)) { if (!B->isAssignmentOp()) return; // Skip non-assignments. - if (DeclRefExpr *DR = dyn_cast<DeclRefExpr>(B->getLHS())) + if (DeclRefExpr *DR = dyn_cast<DeclRefExpr>(B->getLHS()->IgnoreParens())) if (VarDecl *VD = dyn_cast<VarDecl>(DR->getDecl())) { // Special case: check for assigning null to a pointer. // This is a common form of defensive programming. diff --git a/clang/test/Analysis/dead-stores.c b/clang/test/Analysis/dead-stores.c index 1e9f230415163f..05e7566fc9b5a0 100644 --- a/clang/test/Analysis/dead-stores.c +++ b/clang/test/Analysis/dead-stores.c @@ -660,3 +660,20 @@ int rdar34122265_test_nested(int input) { } return bar.x.x + bar.y.y; } + +// Parentheses on the left-hand side must not hide a dead store. +long long dead_store_to_parenthesized_variable(int input) { + int foo; + long long bar; + long baz; + (bar) = input; + // non-nested-warning@-1 {{Value stored to 'bar' is never read}} + (foo) = input; + // non-nested-warning@-1 {{Value stored to 'foo' is never read}} + (baz) = input; + // non-nested-warning@-1 {{Value stored to 'baz' is never read}} + bar = 2; + foo = 2; + baz = 2; + return bar + foo + baz; +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
