//===-- Unittests for feclearexcept with exceptions enabled ---------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "src/fenv/feclearexcept.h" #include "src/__support/FPUtil/FEnvUtils.h" #include "utils/UnitTest/Test.h" #include #include TEST(LlvmLibcFEnvTest, ClearTest) { uint16_t excepts[] = {FE_DIVBYZERO, FE_INVALID, FE_INEXACT, FE_OVERFLOW, FE_UNDERFLOW}; __llvm_libc::fputil::disableExcept(FE_ALL_EXCEPT); __llvm_libc::fputil::clearExcept(FE_ALL_EXCEPT); for (uint16_t e : excepts) ASSERT_EQ(__llvm_libc::fputil::testExcept(e), 0); __llvm_libc::fputil::raiseExcept(FE_ALL_EXCEPT); for (uint16_t e : excepts) { // We clear one exception and test to verify that it was cleared. __llvm_libc::feclearexcept(e); ASSERT_EQ(uint16_t(__llvm_libc::fputil::testExcept(FE_ALL_EXCEPT)), uint16_t(FE_ALL_EXCEPT & ~e)); // After clearing, we raise the exception again. __llvm_libc::fputil::raiseExcept(e); } for (uint16_t e1 : excepts) { for (uint16_t e2 : excepts) { __llvm_libc::feclearexcept(e1 | e2); ASSERT_EQ(uint16_t(__llvm_libc::fputil::testExcept(FE_ALL_EXCEPT)), uint16_t(FE_ALL_EXCEPT & ~(e1 | e2))); __llvm_libc::fputil::raiseExcept(e1 | e2); } } for (uint16_t e1 : excepts) { for (uint16_t e2 : excepts) { for (uint16_t e3 : excepts) { __llvm_libc::feclearexcept(e1 | e2 | e3); ASSERT_EQ(uint16_t(__llvm_libc::fputil::testExcept(FE_ALL_EXCEPT)), uint16_t(FE_ALL_EXCEPT & ~(e1 | e2 | e3))); __llvm_libc::fputil::raiseExcept(e1 | e2 | e3); } } } for (uint16_t e1 : excepts) { for (uint16_t e2 : excepts) { for (uint16_t e3 : excepts) { for (uint16_t e4 : excepts) { __llvm_libc::feclearexcept(e1 | e2 | e3 | e4); ASSERT_EQ(uint16_t(__llvm_libc::fputil::testExcept(FE_ALL_EXCEPT)), uint16_t(FE_ALL_EXCEPT & ~(e1 | e2 | e3 | e4))); __llvm_libc::fputil::raiseExcept(e1 | e2 | e3 | e4); } } } } for (uint16_t e1 : excepts) { for (uint16_t e2 : excepts) { for (uint16_t e3 : excepts) { for (uint16_t e4 : excepts) { for (uint16_t e5 : excepts) { __llvm_libc::feclearexcept(e1 | e2 | e3 | e4 | e5); ASSERT_EQ(uint16_t(__llvm_libc::fputil::testExcept(FE_ALL_EXCEPT)), uint16_t(FE_ALL_EXCEPT & ~(e1 | e2 | e3 | e4 | e5))); __llvm_libc::fputil::raiseExcept(e1 | e2 | e3 | e4 | e5); } } } } } }