Tokenizer: Improved removing of function pointer arguments to avoid false positives
This commit is contained in:
parent
7fd4118d60
commit
f4e0ae3b84
|
@ -6168,11 +6168,22 @@ void Tokenizer::simplifyFunctionPointers()
|
||||||
Token::eraseTokens(tok->link()->linkAt(1), endTok->next());
|
Token::eraseTokens(tok->link()->linkAt(1), endTok->next());
|
||||||
|
|
||||||
// remove variable names
|
// remove variable names
|
||||||
for (Token* tok3 = tok->link()->tokAt(2); Token::Match(tok3, "%name%|*|&|[|(|::|,|<"); tok3 = tok3->next()) {
|
int indent = 0;
|
||||||
|
for (Token* tok3 = tok->link()->tokAt(2); Token::Match(tok3, "%name%|*|&|[|(|)|::|,|<"); tok3 = tok3->next()) {
|
||||||
|
if (tok3->str() == ")" && --indent < 0)
|
||||||
|
break;
|
||||||
if (tok3->str() == "<" && tok3->link())
|
if (tok3->str() == "<" && tok3->link())
|
||||||
tok3 = tok3->link();
|
tok3 = tok3->link();
|
||||||
else if (Token::Match(tok3, "[|("))
|
else if (Token::Match(tok3, "["))
|
||||||
tok3 = tok3->link();
|
tok3 = tok3->link();
|
||||||
|
else if (tok3->str() == "(") {
|
||||||
|
tok3 = tok3->link();
|
||||||
|
if (Token::simpleMatch(tok3, ") (")) {
|
||||||
|
tok3 = tok3->next();
|
||||||
|
++indent;
|
||||||
|
} else
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (Token::Match(tok3, "%type%|*|&|> %name% [,)[]"))
|
if (Token::Match(tok3, "%type%|*|&|> %name% [,)[]"))
|
||||||
tok3->deleteNext();
|
tok3->deleteNext();
|
||||||
}
|
}
|
||||||
|
|
|
@ -2998,14 +2998,23 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
void varid_function_pointer_args() {
|
void varid_function_pointer_args() {
|
||||||
const char code[] = "void foo() {\n"
|
const char code1[] = "void foo() {\n"
|
||||||
" char *text;\n"
|
" char *text;\n"
|
||||||
" void (*cb)(char* text);\n"
|
" void (*cb)(char* text);\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
ASSERT_EQUALS("1: void foo ( ) {\n"
|
ASSERT_EQUALS("1: void foo ( ) {\n"
|
||||||
"2: char * text@1 ;\n"
|
"2: char * text@1 ;\n"
|
||||||
"3: void ( * cb@2 ) ( char * ) ;\n"
|
"3: void ( * cb@2 ) ( char * ) ;\n"
|
||||||
"4: }\n", tokenize(code));
|
"4: }\n", tokenize(code1));
|
||||||
|
|
||||||
|
const char code2[] = "void foo() {\n"
|
||||||
|
" char *text;\n"
|
||||||
|
" void (*f)(int (*arg)(char* text));\n"
|
||||||
|
"}\n";
|
||||||
|
ASSERT_EQUALS("1: void foo ( ) {\n"
|
||||||
|
"2: char * text@1 ;\n"
|
||||||
|
"3: void ( * f@2 ) ( int ( * arg ) ( char * ) ) ;\n"
|
||||||
|
"4: }\n", tokenize(code2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void varidclass1() {
|
void varidclass1() {
|
||||||
|
|
Loading…
Reference in New Issue