@@ -271,21 +271,26 @@ void CheckFunctions::checkMissingReturn()
271271
272272static const Token *checkMissingReturnScope (const Token *tok)
273273{
274- tok = tok-> previous () ;
275- while (tok) {
274+ const Token *lastStatement = nullptr ;
275+ while (( tok = tok-> previous ()) != nullptr ) {
276276 if (tok->str () == " {" )
277- return tok->next ();
277+ return lastStatement ? lastStatement : tok->next ();
278278 if (tok->str () == " }" ) {
279279 for (const Token *prev = tok->link ()->previous (); prev && prev->scope () == tok->scope () && !Token::Match (prev, " [;{}]" ); prev = prev->previous ()) {
280280 if (prev->isKeyword () && Token::Match (prev, " return|throw" ))
281281 return nullptr ;
282282 }
283283 if (tok->scope ()->type == Scope::ScopeType::eSwitch) {
284- // find break/ default
284+ // find reachable break / ! default
285285 bool hasDefault = false ;
286+ bool reachable = false ;
286287 for (const Token *switchToken = tok->link (); switchToken != tok; switchToken = switchToken->next ()) {
287- if (Token::simpleMatch (switchToken, " break ;" ))
288+ if (reachable && Token::simpleMatch (switchToken, " break ;" ))
288289 return switchToken;
290+ if (switchToken->isKeyword () && Token::Match (switchToken, " return|throw" ))
291+ reachable = false ;
292+ if (Token::Match (switchToken, " case|default" ))
293+ reachable = true ;
289294 if (Token::simpleMatch (switchToken, " default :" ))
290295 hasDefault = true ;
291296 else if (switchToken->str () == " {" && switchToken->scope ()->isLoopScope ())
@@ -309,9 +314,8 @@ static const Token *checkMissingReturnScope(const Token *tok)
309314 }
310315 if (tok->isKeyword () && Token::Match (tok, " return|throw" ))
311316 return nullptr ;
312- if (Token::Match (tok, " ; !!}" ))
313- return tok->next ();
314- tok = tok->previous ();
317+ if (Token::Match (tok, " ; !!}" ) && !lastStatement)
318+ lastStatement = tok->next ();
315319 }
316320 return nullptr ;
317321}
0 commit comments