fix #2911 (Token::Match(tok, %oror%|&&) doesn't match &&)

This commit is contained in:
Robert Reif 2011-07-31 13:26:26 -04:00
parent 8d68981119
commit daf0c71f77
2 changed files with 23 additions and 15 deletions

View File

@ -561,6 +561,9 @@ bool Token::Match(const Token *tok, const char pattern[], unsigned int varid)
int result = multiCompare(p, tok->str().c_str()); int result = multiCompare(p, tok->str().c_str());
if (result == -1) if (result == -1)
return false; // No match return false; // No match
while (*p && *p != ' ')
p++;
} }
// single compare.. // single compare..
@ -568,38 +571,40 @@ bool Token::Match(const Token *tok, const char pattern[], unsigned int varid)
{ {
if (tok->str() != "|") if (tok->str() != "|")
return false; return false;
p += 4;
} }
else if (p[3] == 'p') else if (p[3] == 'p')
{ {
if (!tok->isOp()) if (!tok->isOp())
return false; return false;
p += 4;
} }
else else
patternUnderstood = false; patternUnderstood = false;
} }
// Oror (%oror%) // Oror (%oror%)
else else if (p[5] == '%')
{ {
// multicompare.. // multicompare..
if (p[5] == '|') if (p[6] == '|')
{ {
int result = multiCompare(p, tok->str().c_str()); int result = multiCompare(p, tok->str().c_str());
if (result == -1) if (result == -1)
return false; // No match return false; // No match
while (*p && *p != ' ')
p++;
} }
// single compare.. // single compare..
if (tok->str() != "||") else if (tok->str() != "||")
return false; return false;
patternUnderstood = true; else
} p += 6;
if (patternUnderstood) patternUnderstood = true;
{
while (*p && *p != ' ')
p++;
} }
break; break;
default: default:

View File

@ -234,17 +234,20 @@ private:
{ {
givenACodeSampleToTokenize bitwiseOr("|"); givenACodeSampleToTokenize bitwiseOr("|");
ASSERT_EQUALS(true, Token::Match(bitwiseOr.tokens(), "%or%")); ASSERT_EQUALS(true, Token::Match(bitwiseOr.tokens(), "%or%"));
ASSERT_EQUALS(false, Token::Match(bitwiseOr.tokens(), "%op%"));
ASSERT_EQUALS(false, Token::Match(bitwiseOr.tokens(), "%oror%"));
givenACodeSampleToTokenize logicalOr("||"); givenACodeSampleToTokenize logicalOr("||");
ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "%oror%"));
ASSERT_EQUALS(false, Token::Match(logicalOr.tokens(), "%or%")); ASSERT_EQUALS(false, Token::Match(logicalOr.tokens(), "%or%"));
ASSERT_EQUALS(false, Token::Match(bitwiseOr.tokens(), "%oror%")); ASSERT_EQUALS(false, Token::Match(logicalOr.tokens(), "%op%"));
ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "%oror%"));
ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "&&|%oror%")); ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "&&|%oror%"));
ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "%oror%|&&")); ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "%oror%|&&"));
givenACodeSampleToTokenize logicalAnd("&&"); givenACodeSampleToTokenize logicalAnd("&&");
ASSERT_EQUALS(true, Token::Match(logicalAnd.tokens(), "&&"));
ASSERT_EQUALS(true, Token::Match(logicalAnd.tokens(), "&&|%oror%")); ASSERT_EQUALS(true, Token::Match(logicalAnd.tokens(), "&&|%oror%"));
TODO_ASSERT_EQUALS(true, false, Token::Match(logicalAnd.tokens(), "%oror%|&&")); ASSERT_EQUALS(true, Token::Match(logicalAnd.tokens(), "%oror%|&&"));
} }
void matchOp() void matchOp()