From 6f7aa0db5f18718c3871e2975d8debb3d3b485d3 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Wed, 9 Aug 2023 00:41:06 +0200 Subject: [PATCH 1/5] Set ValueType for auto with ternary --- lib/symboldatabase.cpp | 7 +++++++ test/testsymboldatabase.cpp | 23 +++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 4712e646ec8..5439adee1e0 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -6552,6 +6552,13 @@ void SymbolDatabase::setValueType(Token* tok, const ValueType& valuetype, Source setValueType(parent, *vt1); return; } + + if (vt1->pointer == 0U && vt2 && vt2->pointer == 0U) { + if (vt1->isTypeEqual(vt2)) { + setValueType(parent, *vt1); + return; + } + } } if (vt1->pointer != 0U) { diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 3ca63283168..498a8f33fa1 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -511,6 +511,7 @@ class TestSymbolDatabase : public TestFixture { TEST_CASE(auto18); TEST_CASE(auto19); TEST_CASE(auto20); + TEST_CASE(auto21); TEST_CASE(unionWithConstructor); @@ -5716,8 +5717,7 @@ class TestSymbolDatabase : public TestFixture { ASSERT_EQUALS(E1->value, 1); const Token* const a = Token::findsimplematch(tokenizer.tokens(), "auto"); ASSERT(a && a->valueType()); - TODO_ASSERT(E1->scope == a->valueType()->typeScope); - ASSERT_EQUALS(a->valueType()->type, ValueType::INT); + ASSERT(E1->scope == a->valueType()->typeScope); } void sizeOfType() { @@ -9454,6 +9454,25 @@ class TestSymbolDatabase : public TestFixture { ASSERT_EQUALS(g->function()->tokenDef->linenr(), 4); } + void auto21() { + GET_SYMBOL_DB("int f(bool b) {\n" + " std::vector v1(1), v2(2);\n" + " auto& v = b ? v1 : v2;\n" + " v.push_back(1);\n" + " int& r = v[0];" + " return v.size();\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + const Token* a = Token::findsimplematch(tokenizer.tokens(), "auto"); + ASSERT(a && a->valueType()); + ASSERT_EQUALS(a->valueType()->type, ValueType::CONTAINER); + const Token* v = Token::findsimplematch(a, "v . size"); + ASSERT(v && v->valueType()); + ASSERT_EQUALS(v->valueType()->type, ValueType::CONTAINER); + TODO_ASSERT(v->valueType()->reference == Reference::LValue); + ASSERT(v->variable() && v->variable()->isReference()); + } + void unionWithConstructor() { GET_SYMBOL_DB("union Fred {\n" " Fred(int x) : i(x) { }\n" From 1b58a5976d267697f327011851c53a98393d1d71 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Wed, 9 Aug 2023 00:58:17 +0200 Subject: [PATCH 2/5] Simplify --- lib/symboldatabase.cpp | 8 +++----- test/testsymboldatabase.cpp | 1 - 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 5439adee1e0..006164bdca5 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -6553,11 +6553,9 @@ void SymbolDatabase::setValueType(Token* tok, const ValueType& valuetype, Source return; } - if (vt1->pointer == 0U && vt2 && vt2->pointer == 0U) { - if (vt1->isTypeEqual(vt2)) { - setValueType(parent, *vt1); - return; - } + if (vt1->isTypeEqual(vt2)) { + setValueType(parent, *vt1); + return; } } diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 498a8f33fa1..45038160bb7 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -9459,7 +9459,6 @@ class TestSymbolDatabase : public TestFixture { " std::vector v1(1), v2(2);\n" " auto& v = b ? v1 : v2;\n" " v.push_back(1);\n" - " int& r = v[0];" " return v.size();\n" "}\n"); ASSERT_EQUALS("", errout.str()); From 7219a9bfe38df62b6e177311f5c9dcbefa034f91 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 9 Aug 2023 01:11:54 +0200 Subject: [PATCH 3/5] Update misra-test.c --- addons/test/misra/misra-test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/test/misra/misra-test.c b/addons/test/misra/misra-test.c index 2fd30c7e707..dffa5668d99 100644 --- a/addons/test/misra/misra-test.c +++ b/addons/test/misra/misra-test.c @@ -1171,7 +1171,7 @@ static void misra_14_2_fn1(bool b) { g += 2; i2 ^= 2; // 14.2 if (i2 == 2) { - g += g_arr[i2]; + g += g_arr[i2]; // cppcheck-suppress legacyUninitvar } misra_14_2_init_value(&i2); // TODO: Fix false negative in function call } From cddd3c2b850376f08f240b4b83596a738efa9b75 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 17 Aug 2023 21:54:55 +0200 Subject: [PATCH 4/5] Update misra-test.c --- addons/test/misra/misra-test.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/test/misra/misra-test.c b/addons/test/misra/misra-test.c index dffa5668d99..d4e7f39ad6c 100644 --- a/addons/test/misra/misra-test.c +++ b/addons/test/misra/misra-test.c @@ -645,11 +645,11 @@ static void misra_10_1_ternary(void) a = ui16 << ui16; // 10.6 a = ui16 << (get_bool(42) ? ui16 : ui16); - a = ui16 << (get_bool(42) ? ui16 : (get_bool(34) ? ui16 : ui16)); // 10.4 - a = ui16 << (get_bool(42) ? (get_bool(34) ? ui16 : ui16) : ui16); // 10.4 - a = ui16 << (get_bool(42) ? i16 : (get_bool(34) ? ui16 : ui16)); // 10.1 + a = ui16 << (get_bool(42) ? ui16 : (get_bool(34) ? ui16 : ui16)); + a = ui16 << (get_bool(42) ? (get_bool(34) ? ui16 : ui16) : ui16); + a = ui16 << (get_bool(42) ? i16 : (get_bool(34) ? ui16 : ui16)); // 10.1 10.4 a = ui16 << (get_bool(42) ? (get_bool(34) ? ui16 : i16) : ui16); // 10.1 10.4 - a = ui16 << (get_bool(42) ? (get_bool(34) ? ui16 : ui16) : i16); // 10.1 + a = ui16 << (get_bool(42) ? (get_bool(34) ? ui16 : ui16) : i16); // 10.1 10.4 a = ui16 << (get_bool(42) ? (get_bool(34) ? ui16 : ui8) : ui8); // 10.4 a = ui16 << (get_bool(42) ? (get_bool(34) ? i16 : ui8) : ui8); // 10.1 10.4 a = (get_bool(42) ? (get_bool(34) ? ui16 : ui8) : ui8) << ui16; // 10.4 From 4927c4dc548733d562c81bf718523cc051d3f474 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 17 Aug 2023 22:22:20 +0200 Subject: [PATCH 5/5] Remove TODO --- test/testsymboldatabase.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 45038160bb7..4c7bae6b62c 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -9399,7 +9399,6 @@ class TestSymbolDatabase : public TestFixture { ASSERT(autoTok && autoTok->valueType()); ASSERT_EQUALS(autoTok->valueType()->constness, 3); ASSERT_EQUALS(autoTok->valueType()->pointer, 1); - TODO_ASSERT(autoTok->valueType()->reference == Reference::LValue); } void auto19() { // #11517 @@ -9468,7 +9467,6 @@ class TestSymbolDatabase : public TestFixture { const Token* v = Token::findsimplematch(a, "v . size"); ASSERT(v && v->valueType()); ASSERT_EQUALS(v->valueType()->type, ValueType::CONTAINER); - TODO_ASSERT(v->valueType()->reference == Reference::LValue); ASSERT(v->variable() && v->variable()->isReference()); }