Fix #11423 Crash in valueFlowForwardConst() (#4634)

This commit is contained in:
chrchr-github 2022-12-12 22:58:48 +01:00 committed by GitHub
parent 3f5054035d
commit 5b687cb038
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 1 deletions

View File

@ -3917,7 +3917,15 @@ void Tokenizer::setVarIdPass1()
if (!scopeStack.top().isExecutable) if (!scopeStack.top().isExecutable)
newFunctionDeclEnd = isFunctionHead(tok, "{:;"); newFunctionDeclEnd = isFunctionHead(tok, "{:;");
else { else {
Token const * const tokenLinkNext = tok->link()->next(); const Token* tokenLinkNext = tok->link()->next();
if (Token::simpleMatch(tokenLinkNext, ".")) { // skip trailing return type
tokenLinkNext = tokenLinkNext->next();
while (Token::Match(tokenLinkNext, "%name%|::")) {
tokenLinkNext = tokenLinkNext->next();
if (Token::simpleMatch(tokenLinkNext, "<") && tokenLinkNext->link())
tokenLinkNext = tokenLinkNext->link()->next();
}
}
if (tokenLinkNext && tokenLinkNext->str() == "{") // might be for- or while-loop or if-statement if (tokenLinkNext && tokenLinkNext->str() == "{") // might be for- or while-loop or if-statement
newFunctionDeclEnd = tokenLinkNext; newFunctionDeclEnd = tokenLinkNext;
} }

View File

@ -176,6 +176,7 @@ private:
TEST_CASE(varid_lambda_mutable); TEST_CASE(varid_lambda_mutable);
TEST_CASE(varid_trailing_return1); // #8889 TEST_CASE(varid_trailing_return1); // #8889
TEST_CASE(varid_trailing_return2); // #9066 TEST_CASE(varid_trailing_return2); // #9066
TEST_CASE(varid_trailing_return3); // #11423
TEST_CASE(varid_parameter_pack); // #9383 TEST_CASE(varid_parameter_pack); // #9383
TEST_CASE(varid_for_auto_cpp17); TEST_CASE(varid_for_auto_cpp17);
TEST_CASE(varid_not); // #9689 'not x' TEST_CASE(varid_not); // #9689 'not x'
@ -2822,6 +2823,18 @@ private:
ASSERT_EQUALS(exp1, tokenize(code1)); ASSERT_EQUALS(exp1, tokenize(code1));
} }
void varid_trailing_return3() { // #11423
const char code[] = "void f(int a, int b) {\n"
" auto g = [](int& a, const int b) -> void {};\n"
" auto h = [&a, &b]() { std::swap(a, b); };\n"
"}\n";
const char exp[] = "1: void f ( int a@1 , int b@2 ) {\n"
"2: auto g@3 ; g@3 = [ ] ( int & a@4 , const int b@5 ) . void { } ;\n"
"3: auto h@6 ; h@6 = [ & a@1 , & b@2 ] ( ) { std :: swap ( a@1 , b@2 ) ; } ;\n"
"4: }\n";
ASSERT_EQUALS(exp, tokenize(code));
}
void varid_parameter_pack() { // #9383 void varid_parameter_pack() { // #9383
const char code1[] = "template <typename... Rest>\n" const char code1[] = "template <typename... Rest>\n"
"void func(Rest... parameters) {\n" "void func(Rest... parameters) {\n"