Skip to content

Commit 70a1e08

Browse files
authored
fix #11549: internalASTError for lambda with trailing return type (danmar#7302)
1 parent 56400c2 commit 70a1e08

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

lib/tokenlist.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,13 +1020,22 @@ static void compilePrecedence2(Token *&tok, AST_state& state)
10201020
while (Token::Match(curlyBracket, "mutable|const|constexpr|consteval"))
10211021
curlyBracket = curlyBracket->next();
10221022
if (Token::simpleMatch(curlyBracket, "noexcept")) {
1023-
if (Token::simpleMatch(curlyBracket->next(), "("))
1023+
if (Token::simpleMatch(curlyBracket->next(), "(")) {
1024+
AST_state state2(state.cpp);
1025+
Token *tok2 = curlyBracket->tokAt(2);
1026+
compileExpression(tok2, state2);
10241027
curlyBracket = curlyBracket->linkAt(1)->next();
1025-
else
1028+
} else
10261029
curlyBracket = curlyBracket->next();
10271030
}
1028-
if (curlyBracket && curlyBracket->originalName() == "->")
1031+
if (curlyBracket && curlyBracket->originalName() == "->") {
1032+
if (Token::simpleMatch(curlyBracket->next(), "decltype (")) {
1033+
AST_state state2(state.cpp);
1034+
Token *tok2 = curlyBracket->tokAt(3);
1035+
compileExpression(tok2, state2);
1036+
}
10291037
curlyBracket = findTypeEnd(curlyBracket->next());
1038+
}
10301039
if (curlyBracket && curlyBracket->str() == "{") {
10311040
squareBracket->astOperand1(roundBracket);
10321041
roundBracket->astOperand1(curlyBracket);

test/testtokenize.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7031,9 +7031,11 @@ class TestTokenizer : public TestFixture {
70317031
ASSERT_EQUALS("Cc& MakeSpancdata.(csize.(,(",
70327032
testAst("template <typename C> constexpr auto MakeSpan(C &c) -> decltype(MakeSpan(c.data(), c.size())) {}"));
70337033
ASSERT_EQUALS("Eqeq&key_typek&, eqkk,(", testAst("auto KeyTypeCanBeEq(const Eq& eq, const key_type& k) -> decltype(eq(k, k));"));
7034+
ASSERT_EQUALS("h{([= si. {return", testAst("auto h = []() -> decltype(s.i) { return {}; };"));
70347035
}
70357036
void astnoexcept() {
70367037
ASSERT_EQUALS("noexceptaswap.b((", testAst("void f() noexcept(noexcept(a.swap(b))) {}"));
7038+
ASSERT_EQUALS("{([ noexceptaswap.b((", testAst("[]() noexcept(noexcept(a.swap(b))) {}"));
70377039
}
70387040

70397041
//Verify that returning a newly constructed object generates the correct AST even when the class name is scoped

0 commit comments

Comments
 (0)