From ecb2938e7e9d3d2ac399f04c80d313e961ffcd6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 5 Nov 2022 17:38:31 +0100 Subject: [PATCH] SymbolDatabase: Set correct ValueType when there is array-to-pointer decay --- lib/symboldatabase.cpp | 14 +++++++++++++- test/testsymboldatabase.cpp | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 18221cef5..c7b67cdee 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -6207,7 +6207,19 @@ void SymbolDatabase::setValueType(Token* tok, const ValueType& valuetype, Source if (parent->str() == "&" && !parent->astOperand2()) { ValueType vt(valuetype); vt.reference = Reference::None; //Given int& x; the type of &x is int* not int&* - vt.pointer += 1U; + bool isArrayToPointerDecay = false; + for (const Token* child = parent->astOperand1(); child;) { + if (Token::Match(child, ".|::")) + child = child->astOperand2(); + else if (Token::simpleMatch(child, "[")) + child = child->astOperand1(); + else { + isArrayToPointerDecay = child->variable() && child->variable()->isArray(); + break; + } + } + if (!isArrayToPointerDecay) + vt.pointer += 1U; setValueType(parent, vt); return; } diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 8d08888a2..d7ebfd425 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -7601,6 +7601,7 @@ private: ASSERT_EQUALS("signed int", typeOf("int x[10]; a = x[0] + 1;", "+")); ASSERT_EQUALS("", typeOf("a = x[\"hello\"];", "[", "test.cpp")); ASSERT_EQUALS("const char", typeOf("a = x[\"hello\"];", "[", "test.c")); + ASSERT_EQUALS("signed int *", typeOf("int x[10]; a = &x;", "&")); // cast.. ASSERT_EQUALS("void *", typeOf("a = (void *)0;", "("));