templates: Quick fix for the problem with default value for a template argument
This commit is contained in:
parent
401f8aaa96
commit
2719724a97
|
@ -564,6 +564,55 @@ void Tokenizer::simplifyTemplates()
|
||||||
if (used.empty())
|
if (used.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Template arguments with default values
|
||||||
|
for (std::list<Token *>::iterator iter1 = templates.begin(); iter1 != templates.end(); ++iter1)
|
||||||
|
{
|
||||||
|
Token *eq = 0;
|
||||||
|
std::string pattern;
|
||||||
|
for (Token *tok = *iter1; tok; tok = tok->next())
|
||||||
|
{
|
||||||
|
if (tok->str() == ">")
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (tok->str() == ",")
|
||||||
|
{
|
||||||
|
if (pattern.empty())
|
||||||
|
pattern = " < ";
|
||||||
|
else
|
||||||
|
pattern += "%any% , ";
|
||||||
|
}
|
||||||
|
if (tok->str() == "=")
|
||||||
|
{
|
||||||
|
if (Token::Match(tok, "= %any% > class %var% {"))
|
||||||
|
{
|
||||||
|
pattern = tok->strAt(4) + pattern + "%any% >";
|
||||||
|
eq = tok;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!eq || pattern.empty())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (std::list<Token *>::iterator iter2 = used.begin(); iter2 != used.end(); ++iter2)
|
||||||
|
{
|
||||||
|
if (Token::Match(*iter2, pattern.c_str()))
|
||||||
|
{
|
||||||
|
Token *tok = *iter2;
|
||||||
|
while (tok->next()->str() != ">")
|
||||||
|
tok = tok->next();
|
||||||
|
tok->insertToken(eq->strAt(1));
|
||||||
|
tok->insertToken(",");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
eq->deleteThis();
|
||||||
|
eq->deleteThis();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// expand templates
|
// expand templates
|
||||||
for (std::list<Token *>::iterator iter1 = templates.begin(); iter1 != templates.end(); ++iter1)
|
for (std::list<Token *>::iterator iter1 = templates.begin(); iter1 != templates.end(); ++iter1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -929,7 +929,7 @@ private:
|
||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
// The expected result..
|
// The expected result..
|
||||||
const std::string expected(" template < class T , int n = 3 >"
|
const std::string expected(" template < class T , int n >"
|
||||||
" class A"
|
" class A"
|
||||||
" { T ar [ n ] ; } ;"
|
" { T ar [ n ] ; } ;"
|
||||||
" void f ( )"
|
" void f ( )"
|
||||||
|
@ -938,10 +938,10 @@ private:
|
||||||
" A<int,3> a2 ;"
|
" A<int,3> a2 ;"
|
||||||
" }"
|
" }"
|
||||||
" class A<int,2>"
|
" class A<int,2>"
|
||||||
" { int ar[2]; }"
|
" { int ar [ 2 ] ; }"
|
||||||
" class A<int,3>"
|
" class A<int,3>"
|
||||||
" { int ar[3]; }");
|
" { int ar [ 3 ] ; }");
|
||||||
TODO_ASSERT_EQUALS(expected, sizeof_(code));
|
ASSERT_EQUALS(expected, sizeof_(code));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue