Fix case ranges with single quotes and escape sequences (#3248)

This commit is contained in:
keinflue 2021-05-08 09:24:07 +00:00 committed by GitHub
parent 7a009fece0
commit 0a84ad874c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 6 additions and 20 deletions

View File

@ -3243,7 +3243,7 @@ void Tokenizer::simplifyLabelsCaseDefault()
void Tokenizer::simplifyCaseRange()
{
for (Token* tok = list.front(); tok; tok = tok->next()) {
if (Token::Match(tok, "case %num% ... %num% :")) {
if (Token::Match(tok, "case %num%|%char% ... %num%|%char% :")) {
const MathLib::bigint start = MathLib::toLongNumber(tok->strAt(1));
MathLib::bigint end = MathLib::toLongNumber(tok->strAt(3));
end = std::min(start + 50, end); // Simplify it 50 times at maximum
@ -3257,23 +3257,6 @@ void Tokenizer::simplifyCaseRange()
tok->insertToken("case");
}
}
} else if (Token::Match(tok, "case %char% ... %char% :")) {
const char start = tok->strAt(1)[1];
const char end = tok->strAt(3)[1];
if (start < end) {
tok = tok->tokAt(2);
tok->str(":");
tok->insertToken("case");
for (char i = end - 1; i > start; i--) {
tok->insertToken(":");
if (i == '\\') {
tok->insertToken(std::string("\'\\") + i + '\'');
} else {
tok->insertToken(std::string(1, '\'') + i + '\'');
}
tok->insertToken("case");
}
}
}
}
}

View File

@ -5400,10 +5400,13 @@ private:
ASSERT_EQUALS("void f ( ) { switch ( x ) { case 4 ... 1 : ; } }", tokenizeAndStringify("void f() { switch(x) { case 4 ... 1: } }"));
tokenizeAndStringify("void f() { switch(x) { case 1 ... 1000000: } }"); // Do not run out of memory
ASSERT_EQUALS("void f ( ) { switch ( x ) { case 'a' : case 'b' : case 'c' : ; } }", tokenizeAndStringify("void f() { switch(x) { case 'a' ... 'c': } }"));
ASSERT_EQUALS("void f ( ) { switch ( x ) { case 'a' : case 98 : case 'c' : ; } }", tokenizeAndStringify("void f() { switch(x) { case 'a' ... 'c': } }"));
ASSERT_EQUALS("void f ( ) { switch ( x ) { case 'c' ... 'a' : ; } }", tokenizeAndStringify("void f() { switch(x) { case 'c' ... 'a': } }"));
ASSERT_EQUALS("void f ( ) { switch ( x ) { case '[' : case '\\\\' : case ']' : ; } }", tokenizeAndStringify("void f() { switch(x) { case '[' ... ']': } }"));
ASSERT_EQUALS("void f ( ) { switch ( x ) { case '[' : case 92 : case ']' : ; } }", tokenizeAndStringify("void f() { switch(x) { case '[' ... ']': } }"));
ASSERT_EQUALS("void f ( ) { switch ( x ) { case '&' : case 39 : case '(' : ; } }", tokenizeAndStringify("void f() { switch(x) { case '&' ... '(': } }"));
ASSERT_EQUALS("void f ( ) { switch ( x ) { case '\\x61' : case 98 : case '\\x63' : ; } }", tokenizeAndStringify("void f() { switch(x) { case '\\x61' ... '\\x63': } }"));
}
void simplifyEmptyNamespaces() {