@@ -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