Revert fix for #10831 (#4631)

This commit is contained in:
chrchr-github 2022-12-18 16:55:55 +01:00 committed by GitHub
parent 617cd29a41
commit 76c28073aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 13 deletions

View File

@ -4062,6 +4062,17 @@ static const Type* findVariableTypeIncludingUsedNamespaces(const SymbolDatabase*
//---------------------------------------------------------------------------
static const Token* findLambdaEndTokenWithoutAST(const Token* tok) {
if (!(Token::simpleMatch(tok, "[") && tok->link()))
return nullptr;
tok = tok->link()->next();
if (Token::simpleMatch(tok, "(") && tok->link())
tok = tok->link()->next();
if (!(Token::simpleMatch(tok, "{") && tok->link()))
return nullptr;
return tok->link()->next();
};
void Function::addArguments(const SymbolDatabase *symbolDatabase, const Scope *scope)
{
// check for non-empty argument list "( ... )"
@ -4185,7 +4196,7 @@ void Function::addArguments(const SymbolDatabase *symbolDatabase, const Scope *s
initArgCount++;
if (tok->strAt(1) == "[") {
const Token* lambdaStart = tok->next();
tok = findLambdaEndToken(lambdaStart);
tok = type == eLambda ? findLambdaEndTokenWithoutAST(lambdaStart) : findLambdaEndToken(lambdaStart);
if (!tok)
throw InternalError(lambdaStart, "Analysis failed (lambda not recognized). If the code is valid then please report this failure.", InternalError::INTERNAL);
}

View File

@ -489,8 +489,6 @@ struct AST_state {
explicit AST_state(bool cpp) : depth(0), inArrayAssignment(0), cpp(cpp), assign(0), inCase(false),stopAtColon(false), functionCallEndPar(nullptr) {}
};
static Token * createAstAtToken(Token *tok, bool cpp);
static Token* skipDecl(Token* tok, std::vector<Token*>* inner = nullptr)
{
auto isDecltypeFuncParam = [](const Token* tok) -> bool {
@ -1008,9 +1006,6 @@ static void compilePrecedence2(Token *&tok, AST_state& state)
squareBracket->astOperand1(roundBracket);
roundBracket->astOperand1(curlyBracket);
state.op.push(squareBracket);
for (tok = roundBracket->next(); precedes(tok, roundBracket->link()); tok = tok->next()) {
tok = createAstAtToken(tok, state.cpp);
}
tok = curlyBracket->link()->next();
continue;
}
@ -1406,6 +1401,8 @@ const Token* isLambdaCaptureList(const Token * tok)
return params->astOperand1();
}
static Token * createAstAtToken(Token *tok, bool cpp);
// Compile inner expressions inside inner ({..}) and lambda bodies
static void createAstAtTokenInner(Token * const tok1, const Token *endToken, bool cpp)
{

View File

@ -6243,10 +6243,6 @@ private:
ASSERT_EQUALS("decltypexy+(yx+{", testAst("decltype(x+y){y+x};"));
ASSERT_EQUALS("adecltypeac::(,decltypead::(,",
testAst("template <typename a> void b(a &, decltype(a::c), decltype(a::d));"));
ASSERT_EQUALS("g{([= decltypea0[(",
testAst("auto g = [](decltype(a[0]) i) {};"));
ASSERT_EQUALS("g{([= decltypea0[(i&",
testAst("auto g = [](decltype(a[0])& i) {};"));
ASSERT_NO_THROW(tokenizeAndStringify("struct A;\n" // #10839
"struct B { A* hash; };\n"
@ -6281,6 +6277,14 @@ private:
" for (int i = 0; i <= 123; ++i)\n"
" x->emplace_back(y);\n"
"}");
ASSERT_NO_THROW(tokenizeAndStringify("void f() {\n" // #10831
" auto g = [](std::function<void()> h = []() {}) { };\n"
"}"));
ASSERT_NO_THROW(tokenizeAndStringify("void f() {\n" // #11379
" auto l = [x = 3](std::string&& v) { };\n"
"}\n"));
}
void astbrackets() { // []
@ -6505,9 +6509,6 @@ private:
" switch (y) {}\n"
"};"));
// #10831
ASSERT_EQUALS("f{([= x{([=", testAst("void foo() { F f = [](t x = []() {}) {}; }"));
// #11357
ASSERT_NO_THROW(tokenizeAndStringify("void f(std::vector<int>& v, bool c) {\n"
" std::sort(v.begin(), v.end(), [&c](const auto a, const auto b) {\n"