Skip to content

Commit ec1eebf

Browse files
committed
Ticket danmar#6587: Never consider a template parameter's default value as an instantiation.
1 parent 1b9b575 commit ec1eebf

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

lib/token.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -812,7 +812,7 @@ const Token * Token::findClosingBracket() const
812812
for (closing = this; closing != nullptr; closing = closing->next()) {
813813
if (Token::Match(closing, "{|[|("))
814814
closing = closing->link();
815-
else if (Token::Match(closing, "}|]|)|;|="))
815+
else if (Token::Match(closing, "}|]|)|;"))
816816
break;
817817
else if (closing->str() == "<")
818818
++depth;

test/testsimplifytemplate.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ class TestSimplifyTemplate : public TestFixture {
8484
TEST_CASE(template51); // #6172 - crash upon valid code
8585
TEST_CASE(template52); // #6437 - crash upon valid code
8686
TEST_CASE(template53); // #4335 - bail out for valid code
87+
TEST_CASE(template54); // #6587 - memory corruption upon valid code
8788
TEST_CASE(template_unhandled);
8889
TEST_CASE(template_default_parameter);
8990
TEST_CASE(template_default_type);
@@ -951,6 +952,15 @@ class TestSimplifyTemplate : public TestFixture {
951952
ASSERT_EQUALS("", errout.str());
952953
}
953954

955+
void template54() { // #6587
956+
tok("template<typename _Tp> _Tp* fn(); "
957+
"template <class T> struct A { "
958+
" template <class U, class S = decltype(fn<T>())> "
959+
" struct B { }; "
960+
"}; "
961+
"A<int> a;");
962+
}
963+
954964
void template_default_parameter() {
955965
{
956966
const char code[] = "template <class T, int n=3>\n"
@@ -1036,8 +1046,8 @@ class TestSimplifyTemplate : public TestFixture {
10361046
"template<class T1 = A, typename T2 = B<A>> class D { };";
10371047
ASSERT_EQUALS("class A { } ; "
10381048
"template < class T > class B { } ; "
1039-
"template < class T1 , class T2 > class C { } ; "
1040-
"template < class T1 , typename T2 > class D { } ;", tok(code));
1049+
"template < class T1 , class T2 = B < T1 > > class C { } ; "
1050+
"template < class T1 = A , typename T2 = B < A > > class D { } ;", tok(code));
10411051
}
10421052
}
10431053

0 commit comments

Comments
 (0)