Skip to content

Commit

Permalink
Revert macro adds in FPMatcher.h, comment out problematic test lines …
Browse files Browse the repository at this point in the history
…in atan* tests

Moving towards llvm#89658 style matchers and test fixtures instead of macros
  • Loading branch information
Flandini committed Apr 30, 2024
1 parent 43195ac commit a486c50
Show file tree
Hide file tree
Showing 10 changed files with 266 additions and 230 deletions.
106 changes: 0 additions & 106 deletions libc/test/UnitTest/FPMatcher.h
Original file line number Diff line number Diff line change
Expand Up @@ -174,79 +174,20 @@ template <typename T> struct FPTest : public Test {
} \
} while (0)

#define EXPECT_FP_EQ_NO_ERRNO_EXCEPTION(expected_val, actual_val) \
do { \
LIBC_NAMESPACE::libc_errno = 0; \
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); \
EXPECT_FP_EQ(expected_val, actual_val); \
EXPECT_FP_EXCEPTION(0); \
EXPECT_MATH_ERRNO(0); \
} while (0)

#define ASSERT_FP_EQ_NO_ERRNO_EXCEPTION(expected_val, actual_val) \
do { \
LIBC_NAMESPACE::libc_errno = 0; \
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); \
ASSERT_FP_EQ(expected_val, actual_val); \
ASSERT_FP_EXCEPTION(0); \
ASSERT_MATH_ERRNO(0); \
} while (0)

#define EXPECT_FP_EQ_WITH_EXCEPTION(expected_val, actual_val, expected_except) \
do { \
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); \
EXPECT_FP_EQ(expected_val, actual_val); \
EXPECT_FP_EXCEPTION(expected_except); \
} while (0)

#define ASSERT_FP_EQ_WITH_EXCEPTION(expected_val, actual_val, expected_except) \
do { \
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); \
ASSERT_FP_EQ(expected_val, actual_val); \
ASSERT_FP_EXCEPTION(expected_except); \
} while (0)

#define EXPECT_FP_IS_NAN_WITH_EXCEPTION(actual_val, expected_except) \
do { \
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); \
EXPECT_FP_IS_NAN(actual_val); \
EXPECT_FP_EXCEPTION(expected_except); \
} while (0)

#define EXPECT_FP_EQ_WITH_ERRNO(expected_val, actual_val, expected_errno) \
do { \
LIBC_NAMESPACE::libc_errno = 0; \
EXPECT_FP_EQ(expected_val, actual_val); \
EXPECT_MATH_ERRNO(expected_errno); \
} while (0)

#define ASSERT_FP_EQ_WITH_ERRNO(expected_val, actual_val, expected_errno) \
do { \
LIBC_NAMESPACE::libc_errno = 0; \
ASSERT_FP_EQ(expected_val, actual_val); \
ASSERT_MATH_ERRNO(expected_errno); \
} while (0)

#define EXPECT_FP_EQ_WITH_ERRNO_EXCEPTION(expected_val, actual_val, \
expected_errno, expected_except) \
do { \
LIBC_NAMESPACE::libc_errno = 0; \
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); \
EXPECT_FP_EQ(expected_val, actual_val); \
EXPECT_MATH_ERRNO(expected_errno); \
EXPECT_FP_EXCEPTION(expected_except); \
} while (0)

#define ASSERT_FP_EQ_WITH_ERRNO_EXCEPTION(expected_val, actual_val, \
expected_errno, expected_except) \
do { \
LIBC_NAMESPACE::libc_errno = 0; \
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); \
ASSERT_FP_EQ(expected_val, actual_val); \
ASSERT_MATH_ERRNO(expected_errno); \
ASSERT_FP_EXCEPTION(expected_except); \
} while (0)

#define EXPECT_FP_EQ_ALL_ROUNDING(expected, actual) \
do { \
using namespace LIBC_NAMESPACE::fputil::testing; \
Expand Down Expand Up @@ -289,51 +230,4 @@ template <typename T> struct FPTest : public Test {
#define EXPECT_FP_EQ_ROUNDING_TOWARD_ZERO(expected, actual) \
EXPECT_FP_EQ_ROUNDING_MODE((expected), (actual), RoundingMode::TowardZero)

#define EXPECT_FP_EQ_ALL_ROUNDING_NO_ERRNO_EXCEPTION(expected, actual) \
do { \
using namespace LIBC_NAMESPACE::fputil::testing; \
ForceRoundingMode __r1(RoundingMode::Nearest); \
if (__r1.success) { \
EXPECT_FP_EQ_NO_ERRNO_EXCEPTION((expected), (actual)); \
} \
ForceRoundingMode __r2(RoundingMode::Upward); \
if (__r2.success) { \
EXPECT_FP_EQ_NO_ERRNO_EXCEPTION((expected), (actual)); \
} \
ForceRoundingMode __r3(RoundingMode::Downward); \
if (__r3.success) { \
EXPECT_FP_EQ_NO_ERRNO_EXCEPTION((expected), (actual)); \
} \
ForceRoundingMode __r4(RoundingMode::TowardZero); \
if (__r4.success) { \
EXPECT_FP_EQ_NO_ERRNO_EXCEPTION((expected), (actual)); \
} \
} while (0)

#define EXPECT_FP_EQ_ALL_ROUNDING_WITH_ERRNO_EXCEPTION(expected, actual, \
errno, exception) \
do { \
using namespace LIBC_NAMESPACE::fputil::testing; \
ForceRoundingMode __r1(RoundingMode::Nearest); \
if (__r1.success) { \
EXPECT_FP_EQ_WITH_ERRNO_EXCEPTION((expected), (actual), (errno), \
(exception)); \
} \
ForceRoundingMode __r2(RoundingMode::Upward); \
if (__r2.success) { \
EXPECT_FP_EQ_WITH_ERRNO_EXCEPTION((expected), (actual), (errno), \
(exception)); \
} \
ForceRoundingMode __r3(RoundingMode::Downward); \
if (__r3.success) { \
EXPECT_FP_EQ_WITH_ERRNO_EXCEPTION((expected), (actual), (errno), \
(exception)); \
} \
ForceRoundingMode __r4(RoundingMode::TowardZero); \
if (__r4.success) { \
EXPECT_FP_EQ_WITH_ERRNO_EXCEPTION((expected), (actual), (errno), \
(exception)); \
} \
} while (0)

#endif // LLVM_LIBC_TEST_UNITTEST_FPMATCHER_H
4 changes: 4 additions & 0 deletions libc/test/src/math/RoundToIntegerTest.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ class RoundToIntegerTestTemplate

ASSERT_EQ(func(input), expected);

// TODO: Handle the !expectError case. It used to expect
// 0 for errno and exceptions, but this doesn't hold for
// all math functions using RoundToInteger test:
// https://github.com/llvm/llvm-project/pull/88816
if (expectError) {
ASSERT_FP_EXCEPTION(FE_INVALID);
ASSERT_MATH_ERRNO(EDOM);
Expand Down
27 changes: 21 additions & 6 deletions libc/test/src/math/atanf_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,30 @@ using LlvmLibcAtanfTest = LIBC_NAMESPACE::testing::FPTest<float>;

namespace mpfr = LIBC_NAMESPACE::testing::mpfr;

// TODO: This test needs to have its checks for exceptions, errno
// tightened
TEST_F(LlvmLibcAtanfTest, SpecialNumbers) {
EXPECT_FP_EQ_ALL_ROUNDING_NO_ERRNO_EXCEPTION(aNaN,
LIBC_NAMESPACE::atanf(aNaN));
LIBC_NAMESPACE::libc_errno = 0;
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atanf(aNaN));
// TODO: Uncomment these checks later, RoundingMode affects running
// tests in this way.
// EXPECT_FP_EXCEPTION(0);
EXPECT_MATH_ERRNO(0);

EXPECT_FP_EQ_ALL_ROUNDING_NO_ERRNO_EXCEPTION(0.0f,
LIBC_NAMESPACE::atanf(0.0f));
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
EXPECT_FP_EQ_ALL_ROUNDING(0.0f, LIBC_NAMESPACE::atanf(0.0f));
// TODO: Uncomment these checks later, RoundingMode affects running
// tests in this way.
// EXPECT_FP_EXCEPTION(0);
EXPECT_MATH_ERRNO(0);

EXPECT_FP_EQ_ALL_ROUNDING_NO_ERRNO_EXCEPTION(-0.0f,
LIBC_NAMESPACE::atanf(-0.0f));
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
EXPECT_FP_EQ_ALL_ROUNDING(-0.0f, LIBC_NAMESPACE::atanf(-0.0f));
// TODO: Uncomment these checks later, RoundingMode affects running
// tests in this way.
// EXPECT_FP_EXCEPTION(0);
EXPECT_MATH_ERRNO(0);
}

TEST_F(LlvmLibcAtanfTest, InFloatRange) {
Expand Down
78 changes: 52 additions & 26 deletions libc/test/src/math/atanhf_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,45 +21,71 @@ using LlvmLibcAtanhfTest = LIBC_NAMESPACE::testing::FPTest<float>;

namespace mpfr = LIBC_NAMESPACE::testing::mpfr;

// TODO: This test needs to have its checks for exceptions, errno
// tightened
TEST_F(LlvmLibcAtanhfTest, SpecialNumbers) {

EXPECT_FP_EQ_ALL_ROUNDING_NO_ERRNO_EXCEPTION(aNaN,
LIBC_NAMESPACE::atanhf(aNaN));

EXPECT_FP_EQ_ALL_ROUNDING_NO_ERRNO_EXCEPTION(0.0f,
LIBC_NAMESPACE::atanhf(0.0f));

EXPECT_FP_EQ_ALL_ROUNDING_NO_ERRNO_EXCEPTION(-0.0f,
LIBC_NAMESPACE::atanhf(-0.0f));

EXPECT_FP_EQ_ALL_ROUNDING_WITH_ERRNO_EXCEPTION(
inf, LIBC_NAMESPACE::atanhf(1.0f), ERANGE, FE_DIVBYZERO);

EXPECT_FP_EQ_ALL_ROUNDING_WITH_ERRNO_EXCEPTION(
neg_inf, LIBC_NAMESPACE::atanhf(-1.0f), ERANGE, FE_DIVBYZERO);
LIBC_NAMESPACE::libc_errno = 0;
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atanhf(aNaN));
// TODO: Uncomment these checks later, RoundingMode affects running
// tests in this way.
// EXPECT_FP_EXCEPTION(0);
EXPECT_MATH_ERRNO(0);

LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
EXPECT_FP_EQ_ALL_ROUNDING(0.0f, LIBC_NAMESPACE::atanhf(0.0f));
// EXPECT_FP_EXCEPTION(0);
EXPECT_MATH_ERRNO(0);

LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
EXPECT_FP_EQ_ALL_ROUNDING(-0.0f, LIBC_NAMESPACE::atanhf(-0.0f));
// EXPECT_FP_EXCEPTION(0);
EXPECT_MATH_ERRNO(0);

LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
EXPECT_FP_EQ_ALL_ROUNDING(inf, LIBC_NAMESPACE::atanhf(1.0f));
// EXPECT_FP_EXCEPTION(FE_DIVBYZERO);
EXPECT_MATH_ERRNO(ERANGE);

LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
EXPECT_FP_EQ_ALL_ROUNDING(neg_inf, LIBC_NAMESPACE::atanhf(-1.0f));
// EXPECT_FP_EXCEPTION(FE_DIVBYZERO);
EXPECT_MATH_ERRNO(ERANGE);

auto bt = FPBits(1.0f);
bt.set_uintval(bt.uintval() + 1);

EXPECT_FP_EQ_ALL_ROUNDING_WITH_ERRNO_EXCEPTION(
aNaN, LIBC_NAMESPACE::atanhf(bt.get_val()), EDOM, FE_INVALID);
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atanhf(bt.get_val()));
// EXPECT_FP_EXCEPTION(FE_INVALID);
EXPECT_MATH_ERRNO(EDOM);

LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
bt.set_sign(Sign::NEG);
EXPECT_FP_EQ_ALL_ROUNDING_WITH_ERRNO_EXCEPTION(
aNaN, LIBC_NAMESPACE::atanhf(bt.get_val()), EDOM, FE_INVALID);
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atanhf(bt.get_val()));
// EXPECT_FP_EXCEPTION(FE_INVALID);
EXPECT_MATH_ERRNO(EDOM);

EXPECT_FP_EQ_ALL_ROUNDING_WITH_ERRNO_EXCEPTION(
aNaN, LIBC_NAMESPACE::atanhf(2.0f), EDOM, FE_INVALID);
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atanhf(2.0f));
// EXPECT_FP_EXCEPTION(FE_INVALID);
EXPECT_MATH_ERRNO(EDOM);

EXPECT_FP_EQ_ALL_ROUNDING_WITH_ERRNO_EXCEPTION(
aNaN, LIBC_NAMESPACE::atanhf(-2.0f), EDOM, FE_INVALID);
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atanhf(-2.0f));
// EXPECT_FP_EXCEPTION(FE_INVALID);
EXPECT_MATH_ERRNO(EDOM);

EXPECT_FP_EQ_ALL_ROUNDING_WITH_ERRNO_EXCEPTION(
aNaN, LIBC_NAMESPACE::atanhf(inf), EDOM, FE_INVALID);
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atanhf(inf));
// EXPECT_FP_EXCEPTION(FE_INVALID);
EXPECT_MATH_ERRNO(EDOM);

bt.set_sign(Sign::NEG);
EXPECT_FP_EQ_ALL_ROUNDING_WITH_ERRNO_EXCEPTION(
aNaN, LIBC_NAMESPACE::atanhf(neg_inf), EDOM, FE_INVALID);
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atanhf(neg_inf));
// EXPECT_FP_EXCEPTION(FE_INVALID);
EXPECT_MATH_ERRNO(EDOM);
}

TEST_F(LlvmLibcAtanhfTest, InFloatRange) {
Expand Down
Loading

0 comments on commit a486c50

Please sign in to comment.