Skip to content

Commit 9f3ecdd

Browse files
IOBYTEdanmar
authored andcommitted
Fixed #9076 (Template Simplifier : template < template <typename> T >) (#1777)
This does not add support for template templates. It only skips the template template parameter.
1 parent 3f9dd4c commit 9f3ecdd

2 files changed

Lines changed: 17 additions & 0 deletions

File tree

lib/templatesimplifier.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,9 @@ bool TemplateSimplifier::getTemplateDeclarations()
626626
}
627627
if (!Token::simpleMatch(tok, "template <"))
628628
continue;
629+
// ignore template template parameter
630+
if (tok->strAt(-1) == "<")
631+
continue;
629632
// Some syntax checks, see #6865
630633
if (!tok->tokAt(2))
631634
syntaxError(tok->next());

test/testsimplifytemplate.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ class TestSimplifyTemplate : public TestFixture {
142142
TEST_CASE(template102); // #9005
143143
TEST_CASE(template103);
144144
TEST_CASE(template104); // #9021
145+
TEST_CASE(template105); // #9076
145146
TEST_CASE(template_specialization_1); // #7868 - template specialization template <typename T> struct S<C<T>> {..};
146147
TEST_CASE(template_specialization_2); // #7868 - template specialization template <typename T> struct S<C<T>> {..};
147148
TEST_CASE(template_enum); // #6299 Syntax error in complex enum declaration (including template)
@@ -2384,6 +2385,19 @@ class TestSimplifyTemplate : public TestFixture {
23842385
ASSERT_EQUALS(exp, tok(code));
23852386
}
23862387

2388+
void template105() { // #9076
2389+
const char code[] = "template <template <typename> class TOUT> class ObjectCache;\n"
2390+
"template <template <typename> class TOUT>\n"
2391+
"class ObjectCache { };\n"
2392+
"template <typename T> class Fred {};\n"
2393+
"ObjectCache<Fred> _cache;";
2394+
const char exp[] = "class ObjectCache<Fred> ; "
2395+
"template < typename T > class Fred { } ; "
2396+
"ObjectCache<Fred> _cache ; "
2397+
"class ObjectCache<Fred> { } ;";
2398+
ASSERT_EQUALS(exp, tok(code));
2399+
}
2400+
23872401
void template_specialization_1() { // #7868 - template specialization template <typename T> struct S<C<T>> {..};
23882402
const char code[] = "template <typename T> struct C {};\n"
23892403
"template <typename T> struct S {a};\n"

0 commit comments

Comments
 (0)