diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 33cd61be6..e19a1846b 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -1937,10 +1937,10 @@ void CheckStl::string_c_str() } auto isString = [](const Token* str) -> bool { + while (Token::Match(str, "::|.")) + str = str->astOperand2(); if (Token::Match(str, "(|[") && !(str->valueType() && str->valueType()->type == ValueType::ITERATOR)) str = str->previous(); - else if (Token::simpleMatch(str, ".")) - str = str->astOperand2(); return str && ((str->variable() && str->variable()->isStlStringType()) || // variable (str->function() && isStlStringType(str->function()->retDef)) || // function returning string (str->valueType() && str->valueType()->type == ValueType::ITERATOR && isStlStringType(str->valueType()->containerTypeToken))); // iterator pointing to string diff --git a/test/teststl.cpp b/test/teststl.cpp index d35c2fcf1..88bdfa89d 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -3900,6 +3900,7 @@ private: " std::string a[1];\n" " struct U { std::string s; } u;" "};\n" + "namespace N { namespace O { std::string s; } }\n" "void g(const std::vector& v, T& t) {\n" " for (std::vector::const_iterator it = v.begin(); it != v.end(); ++it)\n" " f(it->c_str());\n" @@ -3907,12 +3908,14 @@ private: " f(t.g().c_str());\n" " f(t.a[0].c_str());\n" " f(t.u.s.c_str());\n" + " f(N::O::s.c_str());\n" "}\n"); - ASSERT_EQUALS("[test.cpp:8]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n" - "[test.cpp:9]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n" + ASSERT_EQUALS("[test.cpp:9]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n" "[test.cpp:10]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n" "[test.cpp:11]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n" - "[test.cpp:12]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n", + "[test.cpp:12]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n" + "[test.cpp:13]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n" + "[test.cpp:14]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n", errout.str()); check("void svgFile(const std::string &content, const std::string &fileName, const double end = 1000., const double start = 0.);\n"