Fixed #7740 (Tokenizer::setVarId: Function declaration does not start with 'return')
This commit is contained in:
parent
143e7bf8b1
commit
ba6cda9c86
|
@ -2766,10 +2766,12 @@ void Tokenizer::setVarIdPass1()
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// function declaration inside executable scope?
|
// function declaration inside executable scope? Function declaration is of form: type name "(" args ")"
|
||||||
if (scopeStack.top().isExecutable && Token::Match(tok, "%name% [,)]")) {
|
if (scopeStack.top().isExecutable && Token::Match(tok, "%name% [,)]")) {
|
||||||
bool par = false;
|
bool par = false;
|
||||||
const Token *start, *end;
|
const Token *start, *end;
|
||||||
|
|
||||||
|
// search begin of function declaration
|
||||||
for (start = tok; Token::Match(start, "%name%|*|&|,|("); start = start->previous()) {
|
for (start = tok; Token::Match(start, "%name%|*|&|,|("); start = start->previous()) {
|
||||||
if (start->str() == "(") {
|
if (start->str() == "(") {
|
||||||
if (par)
|
if (par)
|
||||||
|
@ -2783,8 +2785,15 @@ void Tokenizer::setVarIdPass1()
|
||||||
if (start->varId() > 0U)
|
if (start->varId() > 0U)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// search end of function declaration
|
||||||
for (end = tok->next(); Token::Match(end, "%name%|*|&|,"); end = end->next()) {}
|
for (end = tok->next(); Token::Match(end, "%name%|*|&|,"); end = end->next()) {}
|
||||||
if (Token::Match(start, "[;{}] %type% %name%|*") && par && Token::simpleMatch(end, ") ;"))
|
|
||||||
|
// there are tokens which can't appear at the begin of a function declaration such as "return"
|
||||||
|
const bool isNotstartKeyword = start->next() && notstart.find(start->next()->str()) != notstart.end();
|
||||||
|
|
||||||
|
// now check if it is a function declaration
|
||||||
|
if (Token::Match(start, "[;{}] %type% %name%|*") && par && Token::simpleMatch(end, ") ;") && !isNotstartKeyword)
|
||||||
// function declaration => don't set varid
|
// function declaration => don't set varid
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -758,6 +758,15 @@ private:
|
||||||
"3: void bar ( int * p ) ;\n"
|
"3: void bar ( int * p ) ;\n"
|
||||||
"4: }\n";
|
"4: }\n";
|
||||||
ASSERT_EQUALS(expected2, tokenize(code2));
|
ASSERT_EQUALS(expected2, tokenize(code2));
|
||||||
|
|
||||||
|
// #7740
|
||||||
|
const char code3[] = "Float f(float scale) {\n"
|
||||||
|
" return Float(val * scale);\n"
|
||||||
|
"}\n";
|
||||||
|
const char expected3[] = "1: Float f ( float scale@1 ) {\n"
|
||||||
|
"2: return Float ( val * scale@1 ) ;\n"
|
||||||
|
"3: }\n";
|
||||||
|
ASSERT_EQUALS(expected3, tokenize(code3));
|
||||||
}
|
}
|
||||||
|
|
||||||
void varid36() { // ticket #2980 (segmentation fault)
|
void varid36() { // ticket #2980 (segmentation fault)
|
||||||
|
|
Loading…
Reference in New Issue