Skip to content

Commit f323e8a

Browse files
Fix #10311 FP functionConst (cppcheck-opensource#4012)
* Fix #10311 FP functionConst * Format * Format
1 parent 55cb396 commit f323e8a

2 files changed

Lines changed: 34 additions & 14 deletions

File tree

lib/checkclass.cpp

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1988,18 +1988,32 @@ void CheckClass::checkConst()
19881988

19891989
// don't warn when returning non-const pointer/reference
19901990
{
1991-
bool isPointerOrReference = false;
1992-
for (const Token *typeToken = func.retDef; typeToken; typeToken = typeToken->next()) {
1993-
if (Token::Match(typeToken, "(|{|;"))
1994-
break;
1995-
if (!isPointerOrReference && typeToken->str() == "const")
1996-
break;
1997-
if (Token::Match(typeToken, "*|&")) {
1998-
isPointerOrReference = true;
1999-
break;
1991+
auto isPointerOrReference = [this](const Token* start, const Token* end) -> bool {
1992+
bool inTemplArgList = false, isConstTemplArg = false;
1993+
for (const Token* tok = start; tok != end; tok = tok->next()) {
1994+
if (tok->str() == "{") // end of trailing return type
1995+
return false;
1996+
if (tok->str() == "<") {
1997+
if (!tok->link())
1998+
mSymbolDatabase->debugMessage(tok, "debug", "CheckClass::checkConst found unlinked template argument list '" + tok->expressionString() + "'.");
1999+
inTemplArgList = true;
2000+
}
2001+
else if (tok->str() == ">") {
2002+
inTemplArgList = false;
2003+
isConstTemplArg = false;
2004+
}
2005+
else if (tok->str() == "const") {
2006+
if (!inTemplArgList)
2007+
return false;
2008+
isConstTemplArg = true;
2009+
}
2010+
else if (!isConstTemplArg && Token::Match(tok, "*|&"))
2011+
return true;
20002012
}
2001-
}
2002-
if (isPointerOrReference)
2013+
return false;
2014+
};
2015+
2016+
if (isPointerOrReference(func.retDef, func.tokenDef))
20032017
continue;
20042018
}
20052019

test/testclass.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ class TestClass : public TestFixture {
193193
TEST_CASE(const74); // ticket #10671
194194
TEST_CASE(const75); // ticket #10065
195195
TEST_CASE(const76); // ticket #10825
196-
TEST_CASE(const77); // ticket #10307
196+
TEST_CASE(const77); // ticket #10307, #10311
197197
TEST_CASE(const78); // ticket #10315
198198
TEST_CASE(const_handleDefaultParameters);
199199
TEST_CASE(const_passThisToMemberOfOtherClass);
@@ -6033,13 +6033,19 @@ class TestClass : public TestFixture {
60336033
errout.str());
60346034
}
60356035

6036-
void const77() { // #10307
6037-
checkConst("template <typename T>\n"
6036+
void const77() {
6037+
checkConst("template <typename T>\n" // #10307
60386038
"struct S {\n"
60396039
" std::vector<T> const* f() const { return p; }\n"
60406040
" std::vector<T> const* p;\n"
60416041
"};\n");
60426042
ASSERT_EQUALS("", errout.str());
6043+
6044+
checkConst("struct S {\n" // #10311
6045+
" std::vector<const int*> v;\n"
6046+
" std::vector<const int*>& f() { return v; }\n"
6047+
"};\n");
6048+
ASSERT_EQUALS("", errout.str());
60436049
}
60446050

60456051
void const78() { // #10315

0 commit comments

Comments
 (0)