From 039d49bcb1ccc7e4ec27abfce9287494405f1fa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Wed, 31 Jul 2019 12:12:17 +0200 Subject: [PATCH] Improve ValueType::matchParameter for pointers with different types --- lib/symboldatabase.cpp | 4 +++- test/testsymboldatabase.cpp | 17 ++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 07a752994..cb1a31e96 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -5834,8 +5834,10 @@ ValueType::MatchResult ValueType::matchParameter(const ValueType *call, const Va if (call->pointer > 0 && func->type != ValueType::Type::VOID && ((call->constness | func->constness) != func->constness)) return ValueType::MatchResult::UNKNOWN; if (call->type != func->type) { - if (func->type == ValueType::Type::VOID) + if (call->type == ValueType::Type::VOID || func->type == ValueType::Type::VOID) return ValueType::MatchResult::FALLBACK1; + if (call->pointer > 0 && func->pointer > 0) + return ValueType::MatchResult::UNKNOWN; if (call->isIntegral() && func->isIntegral()) return call->type < func->type ? ValueType::MatchResult::FALLBACK1 : diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index e964feef4..43baa147a 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -5533,18 +5533,17 @@ private: } void valueTypeMatchParameter() { - ValueType vt_int; - vt_int.type = ValueType::Type::INT; - vt_int.sign = ValueType::Sign::SIGNED; - - ValueType vt_const_int; - vt_const_int.type = ValueType::Type::INT; - vt_const_int.sign = ValueType::Sign::SIGNED; - vt_const_int.constness = 1; - + ValueType vt_int(ValueType::Sign::SIGNED, ValueType::Type::INT, 0); + ValueType vt_const_int(ValueType::Sign::SIGNED, ValueType::Type::INT, 0, 1); ASSERT_EQUALS((int)ValueType::MatchResult::SAME, (int)ValueType::matchParameter(&vt_int, &vt_int)); ASSERT_EQUALS((int)ValueType::MatchResult::SAME, (int)ValueType::matchParameter(&vt_const_int, &vt_int)); ASSERT_EQUALS((int)ValueType::MatchResult::SAME, (int)ValueType::matchParameter(&vt_int, &vt_const_int)); + + ValueType vt_char_pointer(ValueType::Sign::SIGNED, ValueType::Type::CHAR, 1); + ValueType vt_void_pointer(ValueType::Sign::SIGNED, ValueType::Type::VOID, 1); // compatible + ValueType vt_int_pointer(ValueType::Sign::SIGNED, ValueType::Type::INT, 1); // not compatible + ASSERT_EQUALS((int)ValueType::MatchResult::FALLBACK1, (int)ValueType::matchParameter(&vt_char_pointer, &vt_void_pointer)); + ASSERT_EQUALS((int)ValueType::MatchResult::UNKNOWN, (int)ValueType::matchParameter(&vt_char_pointer, &vt_int_pointer)); } #define FUNC(x) const Function *x = findFunctionByName(#x, &db->scopeList.front()); \