diff options
author | Thomas Lively <tlively@google.com> | 2022-12-02 10:18:37 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-02 08:18:37 -0800 |
commit | e8b41f4a92b8255336888019b5fb6ba014f3c363 (patch) | |
tree | d6981130f856f502c1cd96d6fb7afd83c0f123ed | |
parent | ed06104c6f342d14653932b02d5b060654db0d1d (diff) | |
download | binaryen-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.cpp | 2 | ||||
-rw-r--r-- | test/gtest/wat-lexer.cpp | 18 |
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); } { |