SymbolDatabase: Set correct ValueType when there is array-to-pointer decay
This commit is contained in:
parent
d7a8f7f297
commit
ecb2938e7e
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;", "("));
|
||||
|
|
Loading…
Reference in New Issue