From 56427782061dd4a299ca545a521b5ef5de975a48 Mon Sep 17 00:00:00 2001 From: IOBYTE Date: Tue, 2 Jul 2019 05:40:57 -0400 Subject: [PATCH] Fixed #9193 (functionStatic false positive (inconclusive)) (#1943) --- lib/templatesimplifier.cpp | 4 +++- test/testclass.cpp | 15 +++++++++++++++ test/testsimplifytemplate.cpp | 11 +++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/templatesimplifier.cpp b/lib/templatesimplifier.cpp index 0e0423691..893849743 100644 --- a/lib/templatesimplifier.cpp +++ b/lib/templatesimplifier.cpp @@ -1094,19 +1094,21 @@ void TemplateSimplifier::useDefaultArgumentValues(TokenAndName &declaration) continue; if (end != instantiation.token->tokAt(2)) instantiationArgs.resize(1); - for (const Token *tok1 = instantiation.token->tokAt(2); tok1 && tok1!= end; tok1 = tok1->next()) { + for (const Token *tok1 = instantiation.token->tokAt(2); tok1 && tok1 != end; tok1 = tok1->next()) { if (tok1->link() && Token::Match(tok1, "{|(|[")) { const Token *endLink = tok1->link(); do { instantiationArgs[index].push_back(tok1); tok1 = tok1->next(); } while (tok1 && tok1 != endLink); + instantiationArgs[index].push_back(tok1); } else if (tok1->str() == "<" && (tok1->strAt(1) == ">" || templateParameters(tok1))) { const Token *endLink = tok1->findClosingBracket(); do { instantiationArgs[index].push_back(tok1); tok1 = tok1->next(); } while (tok1 && tok1 != endLink); + instantiationArgs[index].push_back(tok1); } else if (tok1->str() == ",") { ++index; instantiationArgs.resize(index + 1); diff --git a/test/testclass.cpp b/test/testclass.cpp index f0ac9cc74..0e0a86d19 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -174,6 +174,7 @@ private: TEST_CASE(const64); // ticket #6268 TEST_CASE(const65); // ticket #8693 TEST_CASE(const66); // ticket #7714 + TEST_CASE(const67); // ticket #9193 TEST_CASE(const_handleDefaultParameters); TEST_CASE(const_passThisToMemberOfOtherClass); TEST_CASE(assigningPointerToPointerIsNotAConstOperation); @@ -5661,6 +5662,20 @@ private: ASSERT_EQUALS("", errout.str()); } + void const67() { // #9193 + checkConst("template >\n" + "class TestList {\n" + "public:\n" + " LIST_T m_list;\n" + "};\n" + "class Test {\n" + "public:\n" + " const std::list>& get() { return m_test.m_list; }\n" + " TestList> m_test;\n" + "};\n"); + ASSERT_EQUALS("[test.cpp:8]: (style, inconclusive) Technically the member function 'Test::get' can be const.\n", errout.str()); + } + void const_handleDefaultParameters() { checkConst("struct Foo {\n" " void foo1(int i, int j = 0) {\n" diff --git a/test/testsimplifytemplate.cpp b/test/testsimplifytemplate.cpp index bcfcebd03..337391571 100644 --- a/test/testsimplifytemplate.cpp +++ b/test/testsimplifytemplate.cpp @@ -158,6 +158,7 @@ private: TEST_CASE(template118); TEST_CASE(template119); // #9186 TEST_CASE(template120); + TEST_CASE(template121); // #9193 TEST_CASE(template_specialization_1); // #7868 - template specialization template struct S> {..}; TEST_CASE(template_specialization_2); // #7868 - template specialization template struct S> {..}; TEST_CASE(template_enum); // #6299 Syntax error in complex enum declaration (including template) @@ -2849,6 +2850,16 @@ private: ASSERT_EQUALS(exp, tok(code)); } + void template121() { // #9193 + const char code[] = "template >\n" + "class TestList { };\n" + "TestList> m_test;"; + const char exp[] = "class TestList,std::list>> ; " + "TestList,std::list>> m_test ; " + "class TestList,std::list>> { } ;"; + ASSERT_EQUALS(exp, tok(code)); + } + void template_specialization_1() { // #7868 - template specialization template struct S> {..}; const char code[] = "template struct C {};\n" "template struct S {a};\n"