From 5575846a97137ebc6d3b00a1555572f3cb803c6f Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Fri, 20 May 2022 00:18:57 +0200 Subject: [PATCH 1/2] Fix ValueType for references in range-based for loop --- lib/symboldatabase.cpp | 14 ++++++++++---- test/testsymboldatabase.cpp | 6 +++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 442de1c586e..9bd9265882e 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -6139,7 +6139,7 @@ void SymbolDatabase::setValueType(Token *tok, const ValueType &valuetype) // range for loop, auto if (vt2 && parent->str() == ":" && - Token::Match(parent->astParent(), "( const| auto *|&| %var% :") && + Token::Match(parent->astParent(), "( const| auto *|&| %var% :") && // TODO: east-const, multiple const, ref to ptr, rvalue ref !parent->previous()->valueType() && Token::simpleMatch(parent->astParent()->astOperand1(), "for")) { const bool isconst = Token::simpleMatch(parent->astParent()->next(), "const"); @@ -6151,9 +6151,15 @@ void SymbolDatabase::setValueType(Token *tok, const ValueType &valuetype) setValueType(autoToken, autovt); setAutoTokenProperties(autoToken); ValueType varvt(*vt2); - varvt.pointer--; - if (isconst) - varvt.constness |= 1; + varvt.pointer--; + if (Token::simpleMatch(autoToken->next(), "&")) + varvt.reference = Reference::LValue; + if (isconst) { + if (varvt.pointer && varvt.reference != Reference::None) + varvt.constness |= 2; + else + varvt.constness |= 1; + } setValueType(parent->previous(), varvt); Variable *var = const_cast(parent->previous()->variable()); if (var) { diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 3887b1b9c53..4f51f042168 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -7736,7 +7736,11 @@ class TestSymbolDatabase : public TestFixture { ASSERT_EQUALS("signed int", typeOf("; auto data = new X::Y; int x=1000; x=x/5;", "/")); // #7970 ASSERT_EQUALS("signed int *", typeOf("; auto data = new (nothrow) int[100];", "data")); ASSERT_EQUALS("signed int *", typeOf("; auto data = new (std::nothrow) int[100];", "data")); - ASSERT_EQUALS("const signed short", typeOf("short values[10]; void f() { for (const auto *x : values); }", "x")); + ASSERT_EQUALS("const signed short", typeOf("short values[10]; void f() { for (const auto x : values); }", "x")); + ASSERT_EQUALS("const signed short &", typeOf("short values[10]; void f() { for (const auto& x : values); }", "x")); + ASSERT_EQUALS("signed short &", typeOf("short values[10]; void f() { for (auto& x : values); }", "x")); + ASSERT_EQUALS("signed int * &", typeOf("int* values[10]; void f() { for (auto& p : values); }", "p")); + ASSERT_EQUALS("signed int * const &", typeOf("int* values[10]; void f() { for (const auto& p : values); }", "p")); ASSERT_EQUALS("const signed int", typeOf("; const auto x = 3;", "x")); ASSERT_EQUALS("const signed int", typeOf("; constexpr auto x = 3;", "x")); ASSERT_EQUALS("const signed int", typeOf("; const constexpr auto x = 3;", "x")); From 75934cd66a41b9ff89d1bd75aeebe80360308ff4 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Fri, 20 May 2022 00:21:45 +0200 Subject: [PATCH 2/2] Format --- lib/symboldatabase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 9bd9265882e..bcb54f7550f 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -6151,7 +6151,7 @@ void SymbolDatabase::setValueType(Token *tok, const ValueType &valuetype) setValueType(autoToken, autovt); setAutoTokenProperties(autoToken); ValueType varvt(*vt2); - varvt.pointer--; + varvt.pointer--; if (Token::simpleMatch(autoToken->next(), "&")) varvt.reference = Reference::LValue; if (isconst) {