From dd8ed6196c389fb09d5677890df303d5ce05f4bc Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 13 Sep 2023 19:05:16 +0200 Subject: [PATCH 1/3] Fix #11438 MathLib error on user defined literals Co-authored-by: gerboengels --- lib/token.cpp | 9 ++++++--- test/testtoken.cpp | 10 +++++----- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/token.cpp b/lib/token.cpp index 0ad96387d61..c8680a5880f 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -143,9 +143,12 @@ 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 == ">>=" || + } 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(eLiteral); // 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) diff --git a/test/testtoken.cpp b/test/testtoken.cpp index 60f03db1a57..64097d09653 100644 --- a/test/testtoken.cpp +++ b/test/testtoken.cpp @@ -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%")); @@ -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%")); From 6dc8947b1135a42020cfa8a29e51116c44d0e3d5 Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 13 Sep 2023 19:49:48 +0200 Subject: [PATCH 2/3] Use eName for unknown literal --- lib/token.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/token.cpp b/lib/token.cpp index c8680a5880f..e2d0a7c8d10 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -147,7 +147,7 @@ void Token::update_property_info() if (MathLib::isInt(mStr) || MathLib::isFloat(mStr)) tokType(eNumber); else - tokType(eLiteral); // assume it is a user defined literal + 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); From 00a35b084473a62594641aa1159134a15002ad2e Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 13 Sep 2023 19:51:48 +0200 Subject: [PATCH 3/3] Format [skip ci] --- lib/token.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/token.cpp b/lib/token.cpp index e2d0a7c8d10..f047cb456d6 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -149,7 +149,7 @@ void Token::update_property_info() else tokType(eName); // assume it is a user defined literal } else if (mStr == "=" || mStr == "<<=" || mStr == ">>=" || - (mStr.size() == 2U && mStr[1] == '=' && std::strchr("+-*/%&^|", mStr[0]))) + (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);