Tokenizer: added a workaround for #3690 (Support MSVC's 'for each').

This commit is contained in:
Edoardo Prezioso 2012-09-03 20:23:53 +02:00
parent 6100776847
commit 6fd60eebb0
2 changed files with 16 additions and 3 deletions

View File

@ -1593,10 +1593,15 @@ bool Tokenizer::tokenize(std::istream &code,
} }
// if MACRO // if MACRO
for (const Token *tok = list.front(); tok; tok = tok->next()) { for (Token *tok = list.front(); tok; tok = tok->next()) {
if (Token::Match(tok, "if|for|while|BOOST_FOREACH %var% (")) { if (Token::Match(tok, "if|for|while|BOOST_FOREACH %var% (")) {
syntaxError(tok); if (Token::simpleMatch(tok, "for each"))
return false; // 'for each ( )' -> 'for ( )'
tok->deleteNext();
else {
syntaxError(tok);
return false;
}
} }
} }

View File

@ -66,6 +66,8 @@ private:
TEST_CASE(wrong_syntax4); // #3618 TEST_CASE(wrong_syntax4); // #3618
TEST_CASE(wrong_syntax_if_macro); // #2518 - if MACRO() TEST_CASE(wrong_syntax_if_macro); // #2518 - if MACRO()
TEST_CASE(foreach); // #3690
TEST_CASE(minus); TEST_CASE(minus);
TEST_CASE(longtok); TEST_CASE(longtok);
@ -706,6 +708,12 @@ private:
ASSERT_EQUALS("[test.cpp:1]: (error) syntax error\n", errout.str()); ASSERT_EQUALS("[test.cpp:1]: (error) syntax error\n", errout.str());
} }
void foreach() {
// #3690
const std::string code("void f() { for each ( char c in MyString ) { Console::Write(c); } }");
ASSERT_EQUALS("void f ( ) { for ( char c in MyString ) { Console :: Write ( c ) ; } }" ,tokenizeAndStringify(code.c_str()));
}
void minus() { void minus() {
ASSERT_EQUALS("i = -12", tokenizeAndStringify("i = -12")); ASSERT_EQUALS("i = -12", tokenizeAndStringify("i = -12"));
ASSERT_EQUALS("1 - 2", tokenizeAndStringify("1-2")); ASSERT_EQUALS("1 - 2", tokenizeAndStringify("1-2"));