From 0847d3d19a3e0f2cc469220e2ed0487782e2dd7c Mon Sep 17 00:00:00 2001 From: PKEuS Date: Fri, 5 Feb 2016 20:22:30 +0100 Subject: [PATCH] ValueType related bugfixes: - ptrdiff_t is SIGNED - Detect pointers to unknown types as pointers - Do not identify bool* as boolean (#7381) --- lib/astutils.cpp | 2 +- lib/symboldatabase.cpp | 4 ++-- test/testbool.cpp | 8 +++++++- test/testsymboldatabase.cpp | 3 +++ 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 324df5dfa..016aba35d 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -47,7 +47,7 @@ bool astIsFloat(const Token *tok, bool unknown) bool astIsBool(const Token *tok) { - return tok && (tok->isBoolean() || tok->valueType() && tok->valueType()->type == ValueType::Type::BOOL); + return tok && (tok->isBoolean() || (tok->valueType() && tok->valueType()->type == ValueType::Type::BOOL && !tok->valueType()->pointer)); } std::string astCanonicalType(const Token *expr) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index ebee165f2..ea202090f 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -3751,7 +3751,7 @@ static void setValueType(Token *tok, const ValueType &valuetype, bool cpp, Value if (ternary || parent->tokType() == Token::eIncDecOp) // result is pointer setValueType(parent, *vt1, cpp, defaultSignedness); else // result is pointer diff - setValueType(parent, ValueType(ValueType::Sign::UNSIGNED, ValueType::Type::INT, 0U, 0U, "ptrdiff_t"), cpp, defaultSignedness); + setValueType(parent, ValueType(ValueType::Sign::SIGNED, ValueType::Type::INT, 0U, 0U, "ptrdiff_t"), cpp, defaultSignedness); return; } @@ -3852,7 +3852,7 @@ static const Token * parsedecl(const Token *type, ValueType * const valuetype, V valuetype->sign = ValueType::Sign::SIGNED; } - return (type && valuetype->type != ValueType::Type::UNKNOWN_TYPE) ? type : nullptr; + return (type && (valuetype->type != ValueType::Type::UNKNOWN_TYPE || valuetype->pointer > 0)) ? type : nullptr; } void SymbolDatabase::setValueTypeInTokenList(Token *tokens, bool cpp, char defaultSignedness) diff --git a/test/testbool.cpp b/test/testbool.cpp index a0307bc47..ad6e22bfd 100644 --- a/test/testbool.cpp +++ b/test/testbool.cpp @@ -84,7 +84,6 @@ private: void assignBoolToPointer() { - check("void foo(bool *p) {\n" " p = false;\n" "}"); @@ -164,6 +163,13 @@ private: " : (compare(a, c) < 0 ? a : (compare(b, c) < 0 ? c : b));\n" "}", /*experimental=*/false, "test.c"); ASSERT_EQUALS("", errout.str()); + + // #7381 + check("void foo(bool *p, bool b) {\n" + " p = b;\n" + " p = &b;\n" + "}"); + ASSERT_EQUALS("[test.cpp:2]: (error) Boolean value assigned to pointer.\n", errout.str()); } void assignBoolToFloat() { diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index bca3f835b..2e02caf69 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -3254,6 +3254,9 @@ private: // Static members ASSERT_EQUALS("signed int", typeOf("struct AB { static int a; }; x = AB::a;", "::")); + + // Pointer to unknown type + ASSERT_EQUALS("*", typeOf("Bar* b;", "b")); } };