summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2022-12-02 10:18:37 -0600
committerGitHub <noreply@github.com>2022-12-02 08:18:37 -0800
commite8b41f4a92b8255336888019b5fb6ba014f3c363 (patch)
treed6981130f856f502c1cd96d6fb7afd83c0f123ed
parented06104c6f342d14653932b02d5b060654db0d1d (diff)
downloadbinaryen-e8b41f4a92b8255336888019b5fb6ba014f3c363.tar.gz
binaryen-e8b41f4a92b8255336888019b5fb6ba014f3c363.tar.bz2
binaryen-e8b41f4a92b8255336888019b5fb6ba014f3c363.zip
Remove more uses of NAN (#5310)
In favor of the more portable code snippet using `std::copysign`. Also reintroduce assertions that the NaNs have the expected signs. This continues work started in #5302.
-rw-r--r--src/wasm/wat-lexer.cpp2
-rw-r--r--test/gtest/wat-lexer.cpp18
2 files changed, 12 insertions, 8 deletions
diff --git a/src/wasm/wat-lexer.cpp b/src/wasm/wat-lexer.cpp
index befa9f6ab..6d7e9edec 100644
--- a/src/wasm/wat-lexer.cpp
+++ b/src/wasm/wat-lexer.cpp
@@ -221,6 +221,8 @@ struct LexFloatCtx : LexCtx {
std::optional<LexFloatResult> lexed() {
const double posNan = std::copysign(NAN, 1.0);
const double negNan = std::copysign(NAN, -1.0);
+ assert(!std::signbit(posNan) && "expected positive NaN to be positive");
+ assert(std::signbit(negNan) && "expected negative NaN to be negative");
auto basic = LexCtx::lexed();
if (!basic) {
return {};
diff --git a/test/gtest/wat-lexer.cpp b/test/gtest/wat-lexer.cpp
index 0820f4561..3e941a7f6 100644
--- a/test/gtest/wat-lexer.cpp
+++ b/test/gtest/wat-lexer.cpp
@@ -1094,53 +1094,55 @@ TEST(LexerTest, LexInfinity) {
}
TEST(LexerTest, LexNan) {
+ const double posNan = std::copysign(NAN, 1.0);
+ const double negNan = std::copysign(NAN, -1.0);
{
Lexer lexer("nan"sv);
ASSERT_FALSE(lexer.empty());
- Token expected{"nan"sv, FloatTok{{}, NAN}};
+ Token expected{"nan"sv, FloatTok{{}, posNan}};
EXPECT_EQ(*lexer, expected);
}
{
Lexer lexer("+nan"sv);
ASSERT_FALSE(lexer.empty());
- Token expected{"+nan"sv, FloatTok{{}, NAN}};
+ Token expected{"+nan"sv, FloatTok{{}, posNan}};
EXPECT_EQ(*lexer, expected);
}
{
Lexer lexer("-nan"sv);
ASSERT_FALSE(lexer.empty());
- Token expected{"-nan"sv, FloatTok{{}, -NAN}};
+ Token expected{"-nan"sv, FloatTok{{}, negNan}};
EXPECT_EQ(*lexer, expected);
}
{
Lexer lexer("nan:0x01"sv);
ASSERT_FALSE(lexer.empty());
- Token expected{"nan:0x01"sv, FloatTok{{1}, NAN}};
+ Token expected{"nan:0x01"sv, FloatTok{{1}, posNan}};
EXPECT_EQ(*lexer, expected);
}
{
Lexer lexer("+nan:0x01"sv);
ASSERT_FALSE(lexer.empty());
- Token expected{"+nan:0x01"sv, FloatTok{{1}, NAN}};
+ Token expected{"+nan:0x01"sv, FloatTok{{1}, posNan}};
EXPECT_EQ(*lexer, expected);
}
{
Lexer lexer("-nan:0x01"sv);
ASSERT_FALSE(lexer.empty());
- Token expected{"-nan:0x01"sv, FloatTok{{1}, -NAN}};
+ Token expected{"-nan:0x01"sv, FloatTok{{1}, negNan}};
EXPECT_EQ(*lexer, expected);
}
{
Lexer lexer("nan:0x1234"sv);
ASSERT_FALSE(lexer.empty());
- Token expected{"nan:0x1234"sv, FloatTok{{0x1234}, NAN}};
+ Token expected{"nan:0x1234"sv, FloatTok{{0x1234}, posNan}};
EXPECT_EQ(*lexer, expected);
}
{
Lexer lexer("nan:0xf_ffff_ffff_ffff"sv);
ASSERT_FALSE(lexer.empty());
Token expected{"nan:0xf_ffff_ffff_ffff"sv,
- FloatTok{{0xfffffffffffff}, NAN}};
+ FloatTok{{0xfffffffffffff}, posNan}};
EXPECT_EQ(*lexer, expected);
}
{