template: no usage -> no expansion (#292)
This commit is contained in:
parent
80a0e183c5
commit
dae530d8de
|
@ -470,6 +470,7 @@ bool Tokenizer::tokenize(std::istream &code, const char FileName[])
|
|||
|
||||
// Handle templates..
|
||||
simplifyTemplates();
|
||||
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
@ -528,7 +529,7 @@ void Tokenizer::simplifyTemplates()
|
|||
if (!tok)
|
||||
break;
|
||||
}
|
||||
else if (Token::Match(tok, "%var% <"))
|
||||
else if (Token::Match(tok->previous(), "[{};] %var% <"))
|
||||
{
|
||||
used.push_back(tok);
|
||||
}
|
||||
|
|
|
@ -85,6 +85,7 @@ private:
|
|||
TEST_CASE(template5);
|
||||
TEST_CASE(template6);
|
||||
TEST_CASE(template7);
|
||||
TEST_CASE(template8);
|
||||
|
||||
TEST_CASE(namespaces);
|
||||
|
||||
|
@ -653,6 +654,48 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
// Template definitions but no usage => no expansion
|
||||
void template8()
|
||||
{
|
||||
const char code[] = "template<typename T> class A;\n"
|
||||
"template<typename T> class B;\n"
|
||||
"\n"
|
||||
"typedef A<int> x;\n"
|
||||
"typedef B<int> y;\n"
|
||||
"\n"
|
||||
"template<typename T> class A {\n"
|
||||
" void f() {\n"
|
||||
" B<T> a = B<T>::g();\n"
|
||||
" T b = 0;\n"
|
||||
" if (b)\n"
|
||||
" b = 0;\n"
|
||||
" }\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
"template<typename T> inline B<T> h() { return B<T>(); }\n";
|
||||
|
||||
const std::string expected(" template < typename T > class A ;"
|
||||
" template < typename T > class B ;"
|
||||
""
|
||||
" typedef A < int > x ;"
|
||||
" typedef B < int > y ;"
|
||||
""
|
||||
" template < typename T > class A {"
|
||||
" void f ( ) {"
|
||||
" B < T > a = B < T > :: g ( ) ;"
|
||||
" T b ; b = 0 ;"
|
||||
" }"
|
||||
" } ;"
|
||||
""
|
||||
" template < typename T > inline B < T > h ( ) { return B < T > ( ) ; }");
|
||||
|
||||
ASSERT_EQUALS(expected, sizeof_(code));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void namespaces()
|
||||
{
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue