forked from OSchip/llvm-project
[libc] Accommodate Fuchsia's death test framework in fenv tests.
Fuchsia's death test framework runs the closure which can die in a different thread. Hence, the FP exceptions which cause the closure to die should be enalbed in the closure. Reviewed By: michaelrj Differential Revision: https://reviews.llvm.org/D106683
This commit is contained in:
parent
92c085e7c4
commit
c24c18bba6
|
@ -49,6 +49,17 @@ TEST(LlvmLibcExceptionStatusTest, RaiseAndCrash) {
|
|||
ASSERT_EQ(__llvm_libc::fetestexcept(others), others);
|
||||
}
|
||||
|
||||
ASSERT_RAISES_FP_EXCEPT([=] { __llvm_libc::feraiseexcept(e); });
|
||||
ASSERT_RAISES_FP_EXCEPT([=] {
|
||||
// In test frameworks like Fuchsia's zxtest, this translates to
|
||||
// a death test which runs this closure in a different thread. So,
|
||||
// we enable the exception again inside this closure so that the
|
||||
// exception gets enabled for the thread running this closure.
|
||||
__llvm_libc::fputil::enableExcept(e);
|
||||
__llvm_libc::feraiseexcept(e);
|
||||
});
|
||||
|
||||
// Cleanup.
|
||||
__llvm_libc::fputil::disableExcept(FE_ALL_EXCEPT);
|
||||
ASSERT_EQ(__llvm_libc::feclearexcept(FE_ALL_EXCEPT), 0);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,9 +28,20 @@ TEST(LlvmLibcFEnvTest, RaiseAndCrash) {
|
|||
// should not crash/invoke the exception handler.
|
||||
ASSERT_EQ(__llvm_libc::fputil::raiseExcept(e), 0);
|
||||
|
||||
// When we put back the saved env which has the exception enabled, it
|
||||
// should crash with SIGFPE.
|
||||
__llvm_libc::fputil::setEnv(&env);
|
||||
ASSERT_RAISES_FP_EXCEPT([=] { __llvm_libc::fputil::raiseExcept(e); });
|
||||
ASSERT_RAISES_FP_EXCEPT([=] {
|
||||
// When we put back the saved env, which has the exception enabled, it
|
||||
// should crash with SIGFPE. Note that we set the old environment
|
||||
// back inside this closure because in some test frameworks like Fuchsia's
|
||||
// zxtest, this test translates to a death test in which this closure is
|
||||
// run in a different thread. So, we set the old environment inside
|
||||
// this closure so that the exception gets enabled for the thread running
|
||||
// this closure.
|
||||
__llvm_libc::fputil::setEnv(&env);
|
||||
__llvm_libc::fputil::raiseExcept(e);
|
||||
});
|
||||
|
||||
// Cleanup
|
||||
__llvm_libc::fputil::disableExcept(FE_ALL_EXCEPT);
|
||||
ASSERT_EQ(__llvm_libc::fputil::clearExcept(FE_ALL_EXCEPT), 0);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue