diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 6e461958b..411c95535 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -1621,7 +1621,6 @@ void Tokenizer::simplifyTemplates() for (std::list::iterator iter1 = templates.begin(); iter1 != templates.end(); ++iter1) { Token *tok = *iter1; - std::vector type; for (tok = tok->tokAt(2); tok && tok->str() != ">"; tok = tok->next()) { @@ -1635,11 +1634,11 @@ void Tokenizer::simplifyTemplates() // if this is a template function, get the position of the function name unsigned int pos = 0; - if (Token::Match(tok, "> %type% *| %var% (")) + if (Token::Match(tok, "> %type% *|&| %var% (")) pos = 2; - else if (Token::Match(tok, "> %type% %type% *| %var% (")) + else if (Token::Match(tok, "> %type% %type% *|&| %var% (")) pos = 3; - if (pos > 0 && tok->tokAt(pos)->str() == "*") + if (pos > 0 && (tok->tokAt(pos)->str() == "*" || tok->tokAt(pos)->str() == "&")) ++pos; if (_settings && _settings->_debug) diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index c89a8410b..04b6bf27a 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -96,6 +96,7 @@ private: TEST_CASE(template16); TEST_CASE(template17); TEST_CASE(template18); + TEST_CASE(template19); TEST_CASE(template_default_parameter); TEST_CASE(template_default_type); TEST_CASE(template_typename); @@ -1508,6 +1509,26 @@ private: ASSERT_EQUALS(expected, sizeof_(code)); } + void template19() + { + const char code[] = "template T & foo()\n" + "{ static T temp; return temp; }\n" + "\n" + "void f ( )\n" + "{\n" + " char p = foo();\n" + "}\n"; + + // The expected result.. + const std::string expected("; " + "void f ( ) " + "{" + " char p ; p = foo ( ) ; " + "} " + "char & foo ( ) { static char temp ; return temp ; }"); + ASSERT_EQUALS(expected, sizeof_(code)); + } + void template_default_parameter() { {