diff --git a/src/tokenize.cpp b/src/tokenize.cpp index d3d735057..edb1c1dfd 100644 --- a/src/tokenize.cpp +++ b/src/tokenize.cpp @@ -504,6 +504,19 @@ bool Tokenizer::tokenize(std::istream &code, const char FileName[]) void Tokenizer::simplifyTemplates() { + // Remove "typename" unless used in template arguments.. + for (Token *tok = _tokens; tok; tok = tok->next()) + { + if (tok->str() == "typename") + tok->deleteThis(); + + if (Token::simpleMatch(tok, "template <")) + { + while (tok->str() != ">") + tok = tok->next(); + } + } + // Locate templates.. std::list templates; for (Token *tok = _tokens; tok; tok = tok->next()) diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index 386e6fded..d59c85da8 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -79,6 +79,7 @@ private: TEST_CASE(template11); TEST_CASE(template12); TEST_CASE(template_default_parameter); + TEST_CASE(template_typename); TEST_CASE(namespaces); @@ -944,6 +945,18 @@ private: ASSERT_EQUALS(expected, sizeof_(code)); } + void template_typename() + { + const char code[] = "template \n" + "void foo(typename T::t *)\n" + "{ }"; + + // The expected result.. + const std::string expected(" template < class T >" + " void foo ( T :: t * )" + " { }"); + ASSERT_EQUALS(expected, sizeof_(code)); + } void namespaces() {