Skip to content

Commit

Permalink
Fix #11438 MathLib error on user defined literals (danmar#5448)
Browse files Browse the repository at this point in the history
Based on danmar#4701, danmar#5418

A helper function for the `isdigit()` test should be introduced on the
simplecpp side.

Co-authored-by: gerboengels <[email protected]>
  • Loading branch information
chrchr-github and gerboengels authored Sep 15, 2023
1 parent 79e8735 commit 50ba506
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 9 deletions.
11 changes: 7 additions & 4 deletions lib/token.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -143,10 +143,13 @@ void Token::update_property_info()
tokType(eKeyword);
else if (mTokType != eVariable && mTokType != eFunction && mTokType != eType && mTokType != eKeyword)
tokType(eName);
} else if (std::isdigit((unsigned char)mStr[0]) || (mStr.length() > 1 && mStr[0] == '-' && std::isdigit((unsigned char)mStr[1])))
tokType(eNumber);
else if (mStr == "=" || mStr == "<<=" || mStr == ">>=" ||
(mStr.size() == 2U && mStr[1] == '=' && std::strchr("+-*/%&^|", mStr[0])))
} else if (std::isdigit((unsigned char)mStr[0]) || (mStr.length() > 1 && mStr[0] == '-' && std::isdigit((unsigned char)mStr[1]))) {
if (MathLib::isInt(mStr) || MathLib::isFloat(mStr))
tokType(eNumber);
else
tokType(eName); // assume it is a user defined literal
} else if (mStr == "=" || mStr == "<<=" || mStr == ">>=" ||
(mStr.size() == 2U && mStr[1] == '=' && std::strchr("+-*/%&^|", mStr[0])))
tokType(eAssignmentOp);
else if (mStr.size() == 1 && mStr.find_first_of(",[]()?:") != std::string::npos)
tokType(eExtendedOp);
Expand Down
10 changes: 5 additions & 5 deletions test/testtoken.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -637,8 +637,11 @@ class TestToken : public TestFixture {
givenACodeSampleToTokenize nonNumeric("abc", true);
ASSERT_EQUALS(false, Token::Match(nonNumeric.tokens(), "%num%"));

givenACodeSampleToTokenize binary("101010b", true);
ASSERT_EQUALS(true, Token::Match(binary.tokens(), "%num%"));
givenACodeSampleToTokenize msLiteral("5ms", true); // #11438
ASSERT_EQUALS(false, Token::Match(msLiteral.tokens(), "%num%"));

givenACodeSampleToTokenize sLiteral("3s", true);
ASSERT_EQUALS(false, Token::Match(sLiteral.tokens(), "%num%"));

givenACodeSampleToTokenize octal("0123", true);
ASSERT_EQUALS(true, Token::Match(octal.tokens(), "%num%"));
Expand All @@ -652,9 +655,6 @@ class TestToken : public TestFixture {
givenACodeSampleToTokenize floatingPoint("0.0f", true);
ASSERT_EQUALS(true, Token::Match(floatingPoint.tokens(), "%num%"));

givenACodeSampleToTokenize doublePrecision("0.0d", true);
ASSERT_EQUALS(true, Token::Match(doublePrecision.tokens(), "%num%"));

givenACodeSampleToTokenize signedLong("0L", true);
ASSERT_EQUALS(true, Token::Match(signedLong.tokens(), "%num%"));

Expand Down

0 comments on commit 50ba506

Please sign in to comment.