Fixed #5055 (False negatives when using -I (external source code))
This commit is contained in:
parent
00987eb120
commit
1c513f330a
|
@ -76,6 +76,27 @@ void TemplateSimplifier::cleanupAfterSimplify(Token *tokens)
|
|||
if (tok->str() == "(")
|
||||
tok = tok->link();
|
||||
|
||||
else if (Token::Match(tok, "template < > %var%")) {
|
||||
const Token *end = tok;
|
||||
while (end) {
|
||||
if (end->str() == ";")
|
||||
break;
|
||||
if (end->str() == "{") {
|
||||
end = end->link()->next();
|
||||
break;
|
||||
}
|
||||
if (!Token::Match(end, "%var%|::|<|>|>>|,")) {
|
||||
end = NULL;
|
||||
break;
|
||||
}
|
||||
end = end->next();
|
||||
}
|
||||
if (end) {
|
||||
Token::eraseTokens(tok,end);
|
||||
tok->deleteThis();
|
||||
}
|
||||
}
|
||||
|
||||
else if (Token::Match(tok, "%type% <") &&
|
||||
(!tok->previous() || tok->previous()->str() == ";")) {
|
||||
const Token *tok2 = tok->tokAt(2);
|
||||
|
|
|
@ -132,6 +132,7 @@ private:
|
|||
TEST_CASE(template37); // #4544 - A<class B> a;
|
||||
TEST_CASE(template38); // #4832 - crash on C++11 right angle brackets
|
||||
TEST_CASE(template39); // #4742 - freeze
|
||||
TEST_CASE(template40); // #5055 - template specialization outside struct
|
||||
TEST_CASE(template_unhandled);
|
||||
TEST_CASE(template_default_parameter);
|
||||
TEST_CASE(template_default_type);
|
||||
|
@ -2324,6 +2325,14 @@ private:
|
|||
tok(code);
|
||||
}
|
||||
|
||||
void template40() { // #5055 - false negatives when there is template specialization outside struct
|
||||
const char code[] = "struct A {"
|
||||
" template<typename T> struct X { T t; };"
|
||||
"};"
|
||||
"template<> struct A::X<int> { int *t; };";
|
||||
ASSERT_EQUALS("struct A { template < typename T > struct X { T t ; } ; } ;", tok(code));
|
||||
}
|
||||
|
||||
void template_default_parameter() {
|
||||
{
|
||||
const char code[] = "template <class T, int n=3>\n"
|
||||
|
|
Loading…
Reference in New Issue