Fixed LiteralParser accepting a float suffix on a hex float with no exponent. (#437)

This commit is contained in:
Branimir Karadžić
2026-10-01 20:18:37 -07:00
committed by GitHub
parent 1c986bd1e9
commit 74adb68722
2 changed files with 24 additions and 15 deletions

View File

@@ -154,8 +154,9 @@ namespace bx
{
const bool anyHex = acceptDigits(_scanner, isHexNum, _profile.separator);
bool isFloat = false;
bool anyHexFrac = false;
bool isFloat = false;
bool anyHexFrac = false;
bool anyExponent = false;
if (0 != (_profile.flags & LiteralParser::HexFloat) )
{
if (!_scanner.accept('.').isEmpty() )
@@ -168,7 +169,8 @@ namespace bx
if ('p' == ch
|| 'P' == ch)
{
isFloat = true;
isFloat = true;
anyExponent = true;
_scanner.accept();
_scanner.accept('-', '+');
@@ -188,7 +190,10 @@ namespace bx
return LiteralType::Unknown;
}
acceptSuffix(_scanner, _profile.floatSuffix);
if (anyExponent)
{
acceptSuffix(_scanner, _profile.floatSuffix);
}
return LiteralType::Float;
}

View File

@@ -212,17 +212,21 @@ TEST_CASE("LiteralParser WGSL profile", "[parser]")
REQUIRE(testWgsl("0xffu", LP::Hexadecimal) );
// floats: fraction/exponent, edge dots, suffixes, hex float
REQUIRE(testWgsl("1.0", LP::Float) );
REQUIRE(testWgsl(".5", LP::Float) );
REQUIRE(testWgsl("2.", LP::Float) );
REQUIRE(testWgsl("1e5", LP::Float) );
REQUIRE(testWgsl("3.14e-2", LP::Float) );
REQUIRE(testWgsl("1.5f", LP::Float) );
REQUIRE(testWgsl("1f", LP::Float) ); // bare integer + float suffix -> float
REQUIRE(testWgsl("1h", LP::Float) );
REQUIRE(testWgsl("1lf", LP::Float) );
REQUIRE(testWgsl("0x1p-3", LP::Float) );
REQUIRE(testWgsl("0x1.8p3", LP::Float) );
REQUIRE(testWgsl("1.0", LP::Float) );
REQUIRE(testWgsl(".5", LP::Float) );
REQUIRE(testWgsl("2.", LP::Float) );
REQUIRE(testWgsl("1e5", LP::Float) );
REQUIRE(testWgsl("3.14e-2", LP::Float) );
REQUIRE(testWgsl("1.5f", LP::Float) );
REQUIRE(testWgsl("1f", LP::Float) ); // bare integer + float suffix -> float
REQUIRE(testWgsl("1h", LP::Float) );
REQUIRE(testWgsl("1lf", LP::Float) );
REQUIRE(testWgsl("0x1p-3", LP::Float) );
REQUIRE(testWgsl("0x1.8p3", LP::Float) );
REQUIRE(testWgsl("0x1.8p3h", LP::Float) );
REQUIRE(testWgsl("0x1.8p3f", LP::Float) );
REQUIRE(testWgsl("0xf.h", "0xf.", LP::Float) );
REQUIRE(testWgsl("0xf.f", LP::Float) );
// prefix match: trailing input is not part of the literal
REQUIRE(testWgsl("42;", "42", LP::Decimal) );