diff --git a/lib/checkfunctions.cpp b/lib/checkfunctions.cpp index 8904f3aea..160652e19 100644 --- a/lib/checkfunctions.cpp +++ b/lib/checkfunctions.cpp @@ -259,7 +259,9 @@ void CheckFunctions::checkMissingReturn() continue; if (function->type != Function::Type::eFunction && function->type != Function::Type::eOperatorEqual) continue; - if (Token::Match(function->retDef, "void| %name% (")) + if (Token::Match(function->retDef, "%name% (") && function->retDef->isUpperCaseName()) + continue; + if (Function::returnsVoid(function, true)) continue; const Token *errorToken = checkMissingReturnScope(scope->bodyEnd); if (errorToken) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 98a2493ad..9f771feff 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -2677,6 +2677,21 @@ bool Function::returnsReference(const Function* function, bool unknown) return false; } +bool Function::returnsVoid(const Function* function, bool unknown) +{ + if (!function) + return false; + if (function->type != Function::eFunction) + return false; + const Token* defEnd = function->returnDefEnd(); + if (defEnd->strAt(-1) == "void") + return true; + // Check for unknown types, which could be a void type + if (isUnknownType(function->retDef, defEnd)) + return unknown; + return false; +} + std::vector Function::findReturns(const Function* f) { std::vector result; diff --git a/lib/symboldatabase.h b/lib/symboldatabase.h index e8bb48d8f..6b85a29c4 100644 --- a/lib/symboldatabase.h +++ b/lib/symboldatabase.h @@ -908,6 +908,8 @@ public: static bool returnsReference(const Function* function, bool unknown = false); + static bool returnsVoid(const Function* function, bool unknown = false); + static std::vector findReturns(const Function* f); const Token* returnDefEnd() const { diff --git a/test/testfunctions.cpp b/test/testfunctions.cpp index 1ccf41099..b82aba677 100644 --- a/test/testfunctions.cpp +++ b/test/testfunctions.cpp @@ -1376,6 +1376,9 @@ private: check("F(A,B) { x=1; }"); ASSERT_EQUALS("", errout.str()); + check("auto foo4() -> void {}"); + ASSERT_EQUALS("", errout.str()); + // switch check("int f() {\n" " switch (x) {\n"