Skip to content

Commit 5e30dfb

Browse files
authored
fix #13770: Variadic lambda parameters treated as a fold expression (danmar#7607)
1 parent a9f76b7 commit 5e30dfb

File tree

2 files changed

+11
-1
lines changed

2 files changed

+11
-1
lines changed

lib/templatesimplifier.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4061,7 +4061,7 @@ void TemplateSimplifier::simplifyTemplates(const std::time_t maxtime)
40614061
if (Token::Match(tok, "( ... %op%")) {
40624062
op = tok->tokAt(2);
40634063
args = tok->link()->previous();
4064-
} else if (Token::Match(tok, "( %name% %op% ...")) {
4064+
} else if (Token::Match(tok, "( %name% %op% ...") && !Token::simpleMatch(tok->previous(), "] (")) {
40654065
op = tok->tokAt(2);
40664066
args = tok->link()->previous()->isName() ? nullptr : tok->next();
40674067
} else if (Token::Match(tok->link()->tokAt(-3), "%op% ... )")) {

test/testsimplifytemplate.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ class TestSimplifyTemplate : public TestFixture {
220220
TEST_CASE(template179);
221221
TEST_CASE(template180);
222222
TEST_CASE(template181);
223+
TEST_CASE(template182); // #13770
223224
TEST_CASE(template_specialization_1); // #7868 - template specialization template <typename T> struct S<C<T>> {..};
224225
TEST_CASE(template_specialization_2); // #7868 - template specialization template <typename T> struct S<C<T>> {..};
225226
TEST_CASE(template_specialization_3);
@@ -4636,6 +4637,15 @@ class TestSimplifyTemplate : public TestFixture {
46364637
ASSERT_EQUALS(exp2, tok(code2));
46374638
}
46384639

4640+
void template182() {
4641+
const char code[] = "template <class...>\n"
4642+
"auto f() {\n"
4643+
" return [](auto&&...) {};\n"
4644+
"}\n";
4645+
const char exp[] = "template < class ... > auto f ( ) { return [ ] ( auto && ... ) { } ; }";
4646+
ASSERT_EQUALS(exp, tok(code));
4647+
}
4648+
46394649
void template_specialization_1() { // #7868 - template specialization template <typename T> struct S<C<T>> {..};
46404650
const char code[] = "template <typename T> struct C {};\n"
46414651
"template <typename T> struct S {a};\n"

0 commit comments

Comments
 (0)