From ee742ba266982cce356927a5e08b15076ce1d28a Mon Sep 17 00:00:00 2001 From: chrchr Date: Tue, 28 Feb 2023 21:41:08 +0100 Subject: [PATCH 1/4] Set ValueType for free unction returning iterator --- lib/symboldatabase.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index d393d018196..15ce9f7f1e7 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -7066,6 +7066,20 @@ void SymbolDatabase::setValueTypeInTokenList(bool reportDebugWarnings, Token *to } } } + const Library::ArgumentChecks::IteratorInfo* info = mSettings->library.getArgIteratorInfo(tok->previous(), 1); + if (info && info->it) { + const std::vector args = getArguments(tok); + if (!args.empty() && Token::simpleMatch(args[0]->astOperand1(), ".") && args[0]->astOperand1()->astOperand1()) { + const Token* contTok = args[0]->astOperand1()->astOperand1(); + if (contTok && contTok->variable() && contTok->variable()->valueType() && contTok->variable()->valueType()->container) { + ValueType vt; + vt.type = ValueType::Type::ITERATOR; + vt.container = contTok->variable()->valueType()->container; + vt.containerTypeToken = contTok->variable()->valueType()->containerTypeToken; + setValueType(tok, vt); + } + } + } continue; } TokenList tokenList(mSettings); From 6dfcc2ff722b4936aa9845fd9c41ef12c9518740 Mon Sep 17 00:00:00 2001 From: chrchr Date: Tue, 28 Feb 2023 21:41:25 +0100 Subject: [PATCH 2/4] Format --- lib/symboldatabase.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 15ce9f7f1e7..3cba8c77539 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -7068,17 +7068,17 @@ void SymbolDatabase::setValueTypeInTokenList(bool reportDebugWarnings, Token *to } const Library::ArgumentChecks::IteratorInfo* info = mSettings->library.getArgIteratorInfo(tok->previous(), 1); if (info && info->it) { - const std::vector args = getArguments(tok); - if (!args.empty() && Token::simpleMatch(args[0]->astOperand1(), ".") && args[0]->astOperand1()->astOperand1()) { - const Token* contTok = args[0]->astOperand1()->astOperand1(); - if (contTok && contTok->variable() && contTok->variable()->valueType() && contTok->variable()->valueType()->container) { - ValueType vt; - vt.type = ValueType::Type::ITERATOR; - vt.container = contTok->variable()->valueType()->container; - vt.containerTypeToken = contTok->variable()->valueType()->containerTypeToken; - setValueType(tok, vt); + const std::vector args = getArguments(tok); + if (!args.empty() && Token::simpleMatch(args[0]->astOperand1(), ".") && args[0]->astOperand1()->astOperand1()) { + const Token* contTok = args[0]->astOperand1()->astOperand1(); + if (contTok && contTok->variable() && contTok->variable()->valueType() && contTok->variable()->valueType()->container) { + ValueType vt; + vt.type = ValueType::Type::ITERATOR; + vt.container = contTok->variable()->valueType()->container; + vt.containerTypeToken = contTok->variable()->valueType()->containerTypeToken; + setValueType(tok, vt); + } } - } } continue; } From 9c25a9f85a774696bf1a850e993d02702a49d630 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Tue, 28 Feb 2023 23:39:37 +0100 Subject: [PATCH 3/4] Handle plain iterators --- lib/symboldatabase.cpp | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 3cba8c77539..fe32ba8b4be 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -7045,7 +7045,8 @@ void SymbolDatabase::setValueTypeInTokenList(bool reportDebugWarnings, Token *to } } - if (typestr.empty() || typestr == "iterator") { + const bool isReturnIter = typestr == "iterator"; + if (typestr.empty() || isReturnIter) { if (Token::simpleMatch(tok->astOperand1(), ".") && tok->astOperand1()->astOperand1() && tok->astOperand1()->astOperand2() && @@ -7063,20 +7064,25 @@ void SymbolDatabase::setValueTypeInTokenList(bool reportDebugWarnings, Token *to vt.containerTypeToken = tok->astOperand1()->astOperand1()->valueType()->containerTypeToken; setValueType(tok, vt); + continue; } } } - const Library::ArgumentChecks::IteratorInfo* info = mSettings->library.getArgIteratorInfo(tok->previous(), 1); - if (info && info->it) { + if (isReturnIter) { const std::vector args = getArguments(tok); - if (!args.empty() && Token::simpleMatch(args[0]->astOperand1(), ".") && args[0]->astOperand1()->astOperand1()) { - const Token* contTok = args[0]->astOperand1()->astOperand1(); - if (contTok && contTok->variable() && contTok->variable()->valueType() && contTok->variable()->valueType()->container) { - ValueType vt; - vt.type = ValueType::Type::ITERATOR; - vt.container = contTok->variable()->valueType()->container; - vt.containerTypeToken = contTok->variable()->valueType()->containerTypeToken; - setValueType(tok, vt); + if (!args.empty()) { + const Library::ArgumentChecks::IteratorInfo* info = mSettings->library.getArgIteratorInfo(tok->previous(), 1); + if (info && info->it) { + const Token* contTok = args[0]; + if (Token::simpleMatch(args[0]->astOperand1(), ".") && args[0]->astOperand1()->astOperand1()) + contTok = args[0]->astOperand1()->astOperand1(); + if (contTok && contTok->variable() && contTok->variable()->valueType() && contTok->variable()->valueType()->container) { + ValueType vt; + vt.type = ValueType::Type::ITERATOR; + vt.container = contTok->variable()->valueType()->container; + vt.containerTypeToken = contTok->variable()->valueType()->containerTypeToken; + setValueType(tok, vt); + } } } } From 958504600523d75ed71c534f50128588ad6450d0 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Tue, 28 Feb 2023 23:50:34 +0100 Subject: [PATCH 4/4] Add test --- test/testsymboldatabase.cpp | 42 +++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 805a587bda7..8fdf1f34ecc 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -8111,16 +8111,40 @@ class TestSymbolDatabase : public TestFixture { } void valueType3() { - GET_SYMBOL_DB("void f(std::vector>>& v, int i, int j) {\n" - " auto& s = v[i][j];\n" - " s.insert(0);\n" - "}\n"); - ASSERT_EQUALS("", errout.str()); + { + GET_SYMBOL_DB("void f(std::vector>>& v, int i, int j) {\n" + " auto& s = v[i][j];\n" + " s.insert(0);\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); - const Token* tok = tokenizer.tokens(); - tok = Token::findsimplematch(tok, "s ."); - ASSERT(tok && tok->valueType()); - ASSERT_EQUALS("container(std :: set|unordered_set <)", tok->valueType()->str()); + const Token* tok = tokenizer.tokens(); + tok = Token::findsimplematch(tok, "s ."); + ASSERT(tok && tok->valueType()); + ASSERT_EQUALS("container(std :: set|unordered_set <)", tok->valueType()->str()); + } + { + GET_SYMBOL_DB("void f(std::vector v) {\n" + " auto it = std::find(v.begin(), v.end(), 0);\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + + const Token* tok = tokenizer.tokens(); + tok = Token::findsimplematch(tok, "auto"); + ASSERT(tok && tok->valueType()); + ASSERT_EQUALS("iterator(std :: vector <)", tok->valueType()->str()); + } + { + GET_SYMBOL_DB("void f(std::vector::iterator beg, std::vector::iterator end) {\n" + " auto it = std::find(beg, end, 0);\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + + const Token* tok = tokenizer.tokens(); + tok = Token::findsimplematch(tok, "auto"); + ASSERT(tok && tok->valueType()); + ASSERT_EQUALS("iterator(std :: vector <)", tok->valueType()->str()); + } } void valueTypeThis() {