Fixed #7103 (isReturnScope: handling 'return (bstr){0};')

This commit is contained in:
Daniel Marjamäki 2016-01-17 12:38:49 +01:00
parent c676f626b9
commit d656e3a056
2 changed files with 15 additions and 5 deletions

View File

@ -275,6 +275,8 @@ bool isReturnScope(const Token * const endToken)
return false; return false;
const Token *prev = endToken->previous(); const Token *prev = endToken->previous();
while (prev && Token::simpleMatch(prev->previous(), "; ;"))
prev = prev->previous();
if (prev && Token::simpleMatch(prev->previous(), "} ;")) if (prev && Token::simpleMatch(prev->previous(), "} ;"))
prev = prev->previous(); prev = prev->previous();
@ -286,6 +288,10 @@ bool isReturnScope(const Token * const endToken)
!Token::findsimplematch(prev->link(), "break", prev)) { !Token::findsimplematch(prev->link(), "break", prev)) {
return true; return true;
} }
if (Token::simpleMatch(prev->link()->previous(), ") {") &&
Token::simpleMatch(prev->link()->linkAt(-1)->previous(), "return (")) {
return true;
}
} else if (Token::simpleMatch(prev, ";")) { } else if (Token::simpleMatch(prev, ";")) {
// noreturn function // noreturn function
if (Token::simpleMatch(prev->previous(), ") ;") && Token::Match(prev->linkAt(-1)->tokAt(-2), "[;{}] %name% (")) if (Token::simpleMatch(prev->previous(), ") ;") && Token::Match(prev->linkAt(-1)->tokAt(-2), "[;{}] %name% ("))

View File

@ -34,17 +34,21 @@ private:
TEST_CASE(isReturnScope); TEST_CASE(isReturnScope);
} }
bool isReturnScope(const char code[], const char filename[]="test.cpp") { bool isReturnScope(const char code[], int offset) {
Settings settings; Settings settings;
Tokenizer tokenizer(&settings, this); Tokenizer tokenizer(&settings, this);
std::istringstream istr(code); std::istringstream istr(code);
tokenizer.tokenize(istr, filename); tokenizer.tokenize(istr, "test.cpp");
return ::isReturnScope(Token::findsimplematch(tokenizer.tokens(),"}")); const Token * const tok = (offset < 0)
? tokenizer.list.back()->tokAt(1+offset)
: tokenizer.tokens()->tokAt(offset);
return ::isReturnScope(tok);
} }
void isReturnScope() { void isReturnScope() {
ASSERT_EQUALS(true, isReturnScope("void f() { if (a) { return; } }")); ASSERT_EQUALS(true, isReturnScope("void f() { if (a) { return; } }", -2));
ASSERT_EQUALS(true, isReturnScope("void f() { if (a) { return (ab){0}; } }", -2)); // #7103
ASSERT_EQUALS(false, isReturnScope("void f() { if (a) { return (ab){0}; } }", -4)); // #7103
} }
}; };