Fixed #3529 (False 'Boolean result is used in bitwise operation' in a template)
This commit is contained in:
parent
a08dab3776
commit
bfb4dd6425
|
@ -236,6 +236,7 @@ void TemplateSimplifier::removeTemplates(Token *tok)
|
||||||
if (!Token::simpleMatch(tok, "template <"))
|
if (!Token::simpleMatch(tok, "template <"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
int indentlevel = 0;
|
||||||
for (const Token *tok2 = tok->next(); tok2; tok2 = tok2->next()) {
|
for (const Token *tok2 = tok->next(); tok2; tok2 = tok2->next()) {
|
||||||
|
|
||||||
if (tok2->str() == "(") {
|
if (tok2->str() == "(") {
|
||||||
|
@ -275,7 +276,16 @@ void TemplateSimplifier::removeTemplates(Token *tok)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Token::Match(tok2, ">|>> class|struct %var% [,)]")) {
|
if (tok2->str() == "<")
|
||||||
|
++indentlevel;
|
||||||
|
|
||||||
|
else if (indentlevel >= 2 && tok2->str() == ">")
|
||||||
|
--indentlevel;
|
||||||
|
|
||||||
|
else if (indentlevel >= 3 && tok2->str() == ">>")
|
||||||
|
indentlevel -= 2;
|
||||||
|
|
||||||
|
else if (Token::Match(tok2, ">|>> class|struct %var% [,)]")) {
|
||||||
tok2 = tok2->next();
|
tok2 = tok2->next();
|
||||||
Token::eraseTokens(tok, tok2);
|
Token::eraseTokens(tok, tok2);
|
||||||
tok->deleteThis();
|
tok->deleteThis();
|
||||||
|
|
|
@ -120,7 +120,8 @@ private:
|
||||||
TEST_CASE(template26); // #2721 - passing 'char[2]' as template parameter
|
TEST_CASE(template26); // #2721 - passing 'char[2]' as template parameter
|
||||||
TEST_CASE(template27); // #3350 - removing unused template in macro call
|
TEST_CASE(template27); // #3350 - removing unused template in macro call
|
||||||
TEST_CASE(template28);
|
TEST_CASE(template28);
|
||||||
TEST_CASE(template29); // #3449
|
TEST_CASE(template29); // #3449 - don't crash for garbage code
|
||||||
|
TEST_CASE(template30); // #3529 - template < template < ..
|
||||||
TEST_CASE(template_unhandled);
|
TEST_CASE(template_unhandled);
|
||||||
TEST_CASE(template_default_parameter);
|
TEST_CASE(template_default_parameter);
|
||||||
TEST_CASE(template_default_type);
|
TEST_CASE(template_default_type);
|
||||||
|
@ -2152,6 +2153,12 @@ private:
|
||||||
ASSERT_EQUALS("struct B { } ; { } ;", sizeof_(code));
|
ASSERT_EQUALS("struct B { } ; { } ;", sizeof_(code));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void template30() {
|
||||||
|
// #3529 - template < template < ..
|
||||||
|
const char code[] = "template<template<class> class A, class B> void f(){}";
|
||||||
|
ASSERT_EQUALS("", sizeof_(code));
|
||||||
|
}
|
||||||
|
|
||||||
void template_unhandled() {
|
void template_unhandled() {
|
||||||
// An unhandled template usage should be simplified..
|
// An unhandled template usage should be simplified..
|
||||||
ASSERT_EQUALS("x<int> ( ) ;", sizeof_("x<int>();"));
|
ASSERT_EQUALS("x<int> ( ) ;", sizeof_("x<int>();"));
|
||||||
|
|
Loading…
Reference in New Issue