diff --git a/src/tokenize.cpp b/src/tokenize.cpp index db1894326..d3d735057 100644 --- a/src/tokenize.cpp +++ b/src/tokenize.cpp @@ -564,6 +564,55 @@ void Tokenizer::simplifyTemplates() if (used.empty()) return; + + + // Template arguments with default values + for (std::list::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::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 for (std::list::iterator iter1 = templates.begin(); iter1 != templates.end(); ++iter1) { diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index 3ca573a2d..386e6fded 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -929,7 +929,7 @@ private: "}\n"; // The expected result.. - const std::string expected(" template < class T , int n = 3 >" + const std::string expected(" template < class T , int n >" " class A" " { T ar [ n ] ; } ;" " void f ( )" @@ -938,10 +938,10 @@ private: " A a2 ;" " }" " class A" - " { int ar[2]; }" + " { int ar [ 2 ] ; }" " class A" - " { int ar[3]; }"); - TODO_ASSERT_EQUALS(expected, sizeof_(code)); + " { int ar [ 3 ] ; }"); + ASSERT_EQUALS(expected, sizeof_(code)); }