Ticket #6587: Never consider a template parameter's default value as an instantiation.

This commit is contained in:
Simon Martin 2015-03-21 16:30:00 +01:00
parent 1b9b57524e
commit ec1eebf585
2 changed files with 13 additions and 3 deletions

View File

@ -812,7 +812,7 @@ const Token * Token::findClosingBracket() const
for (closing = this; closing != nullptr; closing = closing->next()) {
if (Token::Match(closing, "{|[|("))
closing = closing->link();
else if (Token::Match(closing, "}|]|)|;|="))
else if (Token::Match(closing, "}|]|)|;"))
break;
else if (closing->str() == "<")
++depth;

View File

@ -84,6 +84,7 @@ private:
TEST_CASE(template51); // #6172 - crash upon valid code
TEST_CASE(template52); // #6437 - crash upon valid code
TEST_CASE(template53); // #4335 - bail out for valid code
TEST_CASE(template54); // #6587 - memory corruption upon valid code
TEST_CASE(template_unhandled);
TEST_CASE(template_default_parameter);
TEST_CASE(template_default_type);
@ -951,6 +952,15 @@ private:
ASSERT_EQUALS("", errout.str());
}
void template54() { // #6587
tok("template<typename _Tp> _Tp* fn(); "
"template <class T> struct A { "
" template <class U, class S = decltype(fn<T>())> "
" struct B { }; "
"}; "
"A<int> a;");
}
void template_default_parameter() {
{
const char code[] = "template <class T, int n=3>\n"
@ -1036,8 +1046,8 @@ private:
"template<class T1 = A, typename T2 = B<A>> class D { };";
ASSERT_EQUALS("class A { } ; "
"template < class T > class B { } ; "
"template < class T1 , class T2 > class C { } ; "
"template < class T1 , typename T2 > class D { } ;", tok(code));
"template < class T1 , class T2 = B < T1 > > class C { } ; "
"template < class T1 = A , typename T2 = B < A > > class D { } ;", tok(code));
}
}