From 43b1a0b6e1e4a32ad5bf61f4c8d288844e6339d6 Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 18 Oct 2023 11:25:13 +0200 Subject: [PATCH 1/2] Fix syntaxError with const lambda (refs #11275) --- lib/token.cpp | 4 ++-- test/testtokenize.cpp | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/token.cpp b/lib/token.cpp index a395b4b55e6..bec6b088a2e 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -910,7 +910,7 @@ const Token * Token::findClosingBracket() const if (!mPrevious) return nullptr; - if (!(mPrevious->isName() || + if (!(mPrevious->isName() || Token::simpleMatch(mPrevious, "]") || Token::Match(mPrevious->previous(), "operator %op% <") || Token::Match(mPrevious->tokAt(-2), "operator [([] [)]] <"))) return nullptr; @@ -939,7 +939,7 @@ const Token * Token::findClosingBracket() const return nullptr; // we can make some guesses for template parameters else if (closing->str() == "<" && closing->previous() && - (closing->previous()->isName() || isOperator(closing->previous())) && + (closing->previous()->isName() || Token::simpleMatch(closing->previous(), "]") || isOperator(closing->previous())) && (templateParameter ? templateParameters.find(closing->strAt(-1)) == templateParameters.end() : true)) ++depth; else if (closing->str() == ">") { diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 7bda0678e41..43fab0be5ff 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -3496,6 +3496,20 @@ class TestTokenizer : public TestFixture { ASSERT_EQUALS(true, tok2->link() == tok1); } + { + const char code[] = "void f() {\n" + " const auto g = []() {};\n" + "}\n"; + errout.str(""); + Tokenizer tokenizer(&settings0, this); + std::istringstream istr(code); + ASSERT(tokenizer.tokenize(istr, "test.cpp")); + const Token* tok1 = Token::findsimplematch(tokenizer.tokens(), "< T"); + const Token* tok2 = Token::findsimplematch(tok1, "> ("); + ASSERT_EQUALS(true, tok1->link() == tok2); + ASSERT_EQUALS(true, tok2->link() == tok1); + } + { // #11810 const char code[] = "void f() {\n" " auto g = [] (A a, B&& b) { return a < b; };\n" From 1089523a05db65af8c01465b36db8cccd2acc625 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Thu, 19 Oct 2023 00:02:31 +0200 Subject: [PATCH 2/2] Move test --- test/testtoken.cpp | 8 ++++++++ test/testtokenize.cpp | 14 -------------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/test/testtoken.cpp b/test/testtoken.cpp index 64097d09653..827f6f20c43 100644 --- a/test/testtoken.cpp +++ b/test/testtoken.cpp @@ -106,6 +106,7 @@ class TestToken : public TestFixture { TEST_CASE(canFindMatchingBracketsWithTooManyClosing); TEST_CASE(canFindMatchingBracketsWithTooManyOpening); TEST_CASE(findClosingBracket); + TEST_CASE(findClosingBracket2); TEST_CASE(expressionString); @@ -1084,6 +1085,13 @@ class TestToken : public TestFixture { ASSERT(Token::simpleMatch(t, "> struct")); } + void findClosingBracket2() const { + givenACodeSampleToTokenize var("const auto g = []() {};\n"); // #11275 + + const Token* const t = Token::findsimplematch(var.tokens(), "<"); + ASSERT(t && Token::simpleMatch(t->findClosingBracket(), ">")); + } + void expressionString() const { givenACodeSampleToTokenize var1("void f() { *((unsigned long long *)x) = 0; }"); const Token *const tok1 = Token::findsimplematch(var1.tokens(), "*"); diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 43fab0be5ff..7bda0678e41 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -3496,20 +3496,6 @@ class TestTokenizer : public TestFixture { ASSERT_EQUALS(true, tok2->link() == tok1); } - { - const char code[] = "void f() {\n" - " const auto g = []() {};\n" - "}\n"; - errout.str(""); - Tokenizer tokenizer(&settings0, this); - std::istringstream istr(code); - ASSERT(tokenizer.tokenize(istr, "test.cpp")); - const Token* tok1 = Token::findsimplematch(tokenizer.tokens(), "< T"); - const Token* tok2 = Token::findsimplematch(tok1, "> ("); - ASSERT_EQUALS(true, tok1->link() == tok2); - ASSERT_EQUALS(true, tok2->link() == tok1); - } - { // #11810 const char code[] = "void f() {\n" " auto g = [] (A a, B&& b) { return a < b; };\n"