Skip to content

Commit 55ae8c4

Browse files
authored
Fix #14896: false positive: missing co_return in void function (#8719)
1 parent d272996 commit 55ae8c4

4 files changed

Lines changed: 26 additions & 0 deletions

File tree

lib/checkfunctions.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,8 @@ void CheckFunctionsImpl::checkMissingReturn()
329329
continue;
330330
if (Function::returnsVoid(function, true))
331331
continue;
332+
if (Function::isCoroutine(function, mSettings.standards, *mTokenizer))
333+
continue;
332334
const Token *errorToken = checkMissingReturnScope(scope->bodyEnd, mSettings.library);
333335
if (errorToken)
334336
missingReturnError(errorToken);

lib/symboldatabase.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3407,6 +3407,20 @@ bool Function::returnsVoid(const Function* function, bool unknown)
34073407
});
34083408
}
34093409

3410+
bool Function::isCoroutine(const Function* function, const Standards &standards, const Tokenizer &tokens)
3411+
{
3412+
if (!tokens.isCPP() || standards.cpp < Standards::CPP20)
3413+
return false;
3414+
if (!function->functionScope)
3415+
return false;
3416+
const Scope *scope = function->functionScope;
3417+
for (const Token *tok = scope->bodyStart; tok != scope->bodyEnd; tok = tok->next()) {
3418+
if (Token::Match(tok, "co_return|co_await|co_yield"))
3419+
return true;
3420+
}
3421+
return false;
3422+
}
3423+
34103424
std::vector<const Token*> Function::findReturns(const Function* f)
34113425
{
34123426
std::vector<const Token*> result;

lib/symboldatabase.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -945,6 +945,7 @@ class CPPCHECKLIB Function {
945945
static bool returnsStandardType(const Function* function, bool unknown = false);
946946

947947
static bool returnsVoid(const Function* function, bool unknown = false);
948+
static bool isCoroutine(const Function* function, const Standards &standards, const Tokenizer &tokens);
948949

949950
static std::vector<const Token*> findReturns(const Function* f);
950951

test/testfunctions.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ class TestFunctions : public TestFixture {
8686
TEST_CASE(checkMissingReturn5);
8787
TEST_CASE(checkMissingReturn6); // #13180
8888
TEST_CASE(checkMissingReturn7); // #14370 - FN try/catch
89+
TEST_CASE(checkMissingReturn8);
8990
TEST_CASE(checkMissingReturnStdInt); // #14482 - FN std::int32_t
9091

9192
// std::move for locar variable
@@ -1927,6 +1928,14 @@ class TestFunctions : public TestFixture {
19271928
ASSERT_EQUALS("[test.cpp:3:19]: (error) Found an exit path from function with non-void return type that has missing return statement [missingReturn]\n", errout_str());
19281929
}
19291930

1931+
void checkMissingReturn8() {
1932+
const Settings s = settingsBuilder(settings).cpp(Standards::CPP20).build();
1933+
check("boost::asio::awaitable<void> test() {\n"
1934+
" co_return;\n"
1935+
"}\n",s);
1936+
ASSERT_EQUALS("", errout_str());
1937+
}
1938+
19301939
void checkMissingReturnStdInt() {// #14482 - FN
19311940
check("std::int32_t f() {}\n");
19321941
ASSERT_EQUALS("[test.cpp:1:19]: (error) Found an exit path from function with non-void return type that has missing return statement [missingReturn]\n", errout_str());

0 commit comments

Comments
 (0)