Skip to content

Commit 3a2bf21

Browse files
authored
fix #13640: Missing AST for decltype expression (danmar#7307)
1 parent 391a109 commit 3a2bf21

File tree

2 files changed

+12
-13
lines changed

2 files changed

+12
-13
lines changed

lib/tokenlist.cpp

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1582,19 +1582,17 @@ static Token * createAstAtToken(Token *tok)
15821582
return tok2;
15831583
}
15841584
if (Token *const endTok = skipMethodDeclEnding(tok)) {
1585-
if (Token::simpleMatch(endTok, "{")) {
1586-
Token *tok2 = tok;
1587-
do {
1588-
tok2 = tok2->next();
1589-
tok2->setCpp11init(false);
1590-
if (Token::Match(tok2, "decltype|noexcept (")) {
1591-
AST_state state(cpp);
1592-
Token *tok3 = tok2->tokAt(2);
1593-
compileExpression(tok3, state);
1594-
tok2 = tok2->linkAt(1);
1595-
}
1596-
} while (tok2 != endTok && !precedes(endTok, tok2));
1597-
}
1585+
Token *tok2 = tok;
1586+
do {
1587+
tok2 = tok2->next();
1588+
tok2->setCpp11init(false);
1589+
if (Token::Match(tok2, "decltype|noexcept (")) {
1590+
AST_state state(cpp);
1591+
Token *tok3 = tok2->tokAt(2);
1592+
compileExpression(tok3, state);
1593+
tok2 = tok2->linkAt(1);
1594+
}
1595+
} while (tok2 != endTok && !precedes(endTok, tok2));
15981596
return endTok;
15991597
}
16001598
if (Token::Match(tok, "%type%") && !Token::Match(tok, "return|throw|if|while|new|delete")) {

test/testtokenize.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7026,6 +7026,7 @@ class TestTokenizer : public TestFixture {
70267026
ASSERT_EQUALS("Cc& csize.(", testAst("template<class C> constexpr auto s(const C &c) noexcept -> decltype(c.size()) {}"));
70277027
ASSERT_EQUALS("Cc& MakeSpancdata.(csize.(,(",
70287028
testAst("template <typename C> constexpr auto MakeSpan(C &c) -> decltype(MakeSpan(c.data(), c.size())) {}"));
7029+
ASSERT_EQUALS("Eqeq&key_typek&, eqkk,(", testAst("auto KeyTypeCanBeEq(const Eq& eq, const key_type& k) -> decltype(eq(k, k));"));
70297030
}
70307031
void astnoexcept() {
70317032
ASSERT_EQUALS("noexceptaswap.b((", testAst("void f() noexcept(noexcept(a.swap(b))) {}"));

0 commit comments

Comments
 (0)