From 2b179dc836bec5242acab06555aef6f3fe123356 Mon Sep 17 00:00:00 2001 From: PKEuS Date: Fri, 5 Feb 2016 09:59:27 +0100 Subject: [PATCH] ValueType: Properly support ternary operator with pointers (#7378) --- lib/symboldatabase.cpp | 7 +++++-- test/testsymboldatabase.cpp | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 49df6273c..0ea413086 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -3749,8 +3749,11 @@ static void setValueType(Token *tok, const ValueType &valuetype, bool cpp, Value return; } - if (vt1->pointer != 0U) { // result is pointer diff - setValueType(parent, ValueType(ValueType::Sign::UNSIGNED, ValueType::Type::INT, 0U, 0U, "ptrdiff_t"), cpp, defaultSignedness); + if (vt1->pointer != 0U) { + if (ternary) // 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); return; } diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 210074ecb..3b4a91ac6 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -3199,6 +3199,8 @@ private: ASSERT_EQUALS("signed int", typeOf("int x; a = (b ? x : x)", "?")); ASSERT_EQUALS("", typeOf("int x; a = (b ? x : y)", "?")); ASSERT_EQUALS("double", typeOf("int x; double y; a = (b ? x : y)", "?")); + ASSERT_EQUALS("const char *", typeOf("int x; double y; a = (b ? \"a\" : \"b\")", "?")); + ASSERT_EQUALS("", typeOf("int x; double y; a = (b ? \"a\" : std::string(\"b\"))", "?")); // shift => result has same type as lhs ASSERT_EQUALS("signed int", typeOf("int x; a = x << 1U;", "<<"));