Skip to content

Commit eec4ce9

Browse files
committed
Assignment fix
1 parent 99674e1 commit eec4ce9

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

lib/fwdanalysis.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *expr, const Token *
327327
if (parent->variable() && parent->variable()->type() && parent->variable()->type()->isUnionType() && parent->varId() == expr->varId()) {
328328
while (parent && Token::simpleMatch(parent->astParent(), "."))
329329
parent = parent->astParent();
330-
if (parent && parent->valueType() && Token::Match(parent->astParent(), "%assign%") && !Token::Match(parent->astParent()->astParent(), "%assign%") && parent->astParent()->astOperand1() == parent) {
330+
if (parent && parent->valueType() && Token::simpleMatch(parent->astParent(), "=") && !Token::Match(parent->astParent()->astParent(), "%assign%") && parent->astParent()->astOperand1() == parent) {
331331
const Token * assignment = parent->astParent()->astOperand2();
332332
while (Token::simpleMatch(assignment, ".") && assignment->varId() != expr->varId())
333333
assignment = assignment->astOperand1();

test/testother.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -4552,6 +4552,27 @@ class TestOther : public TestFixture {
45524552
" u.as_int = 0;\n"
45534553
"}", true, false, false);
45544554
ASSERT_EQUALS("", errout_str());
4555+
4556+
// Ticket #5115 "redundantAssignment when using a union"
4557+
check("#include <stdio.h>\n"
4558+
"typedef union{\n"
4559+
" char as_char[4];\n"
4560+
" int as_int;\n"
4561+
"} union_t;\n"
4562+
"void fn(char *data, int len) {\n"
4563+
" int i;\n"
4564+
" for (i = 0; i < len; i++)\n"
4565+
" data[i] = 'a';\n"
4566+
"}\n"
4567+
"void foo(char *ptr) {\n"
4568+
" union {\n"
4569+
" char * s8;\n"
4570+
" unsigned long long u64;\n"
4571+
" } addr;\n"
4572+
" addr.s8 = ptr;\n"
4573+
" addr.u64 += 8;\n"
4574+
"}", true, false, false);
4575+
ASSERT_EQUALS("", errout_str());
45554576
}
45564577

45574578
void switchRedundantOperationTest() {

0 commit comments

Comments
 (0)