diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index b3bc44030..0124fc96b 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -3688,6 +3688,12 @@ static void setValueType(Token *tok, const ValueType &valuetype, bool cpp, Value return; } + if (parent->isAssignmentOp()) { + if (vt1) + setValueType(parent, *vt1, cpp, defaultSignedness); + return; + } + if (parent->str() == "[" && valuetype.pointer > 0U) { ValueType vt(valuetype); vt.pointer -= 1U; diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 2e02caf69..677270bf9 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -3220,6 +3220,9 @@ private: ASSERT_EQUALS("", typeOf("a = 12 << x;", "<<", "test.cpp")); // << might be overloaded ASSERT_EQUALS("signed int", typeOf("a = 12 << x;", "<<", "test.c")); + // assignment => result has same type as lhs + ASSERT_EQUALS("unsigned short", typeOf("unsigned short x; x = 3;", "=")); + // array.. ASSERT_EQUALS("void * *", typeOf("void * x[10]; a = x + 0;", "+")); ASSERT_EQUALS("signed int *", typeOf("int x[10]; a = x + 1;", "+"));