diff --git a/include/gsl/gsl_assert b/include/gsl/gsl_assert index 43da231..2c9cb8d 100644 --- a/include/gsl/gsl_assert +++ b/include/gsl/gsl_assert @@ -72,19 +72,55 @@ struct fail_fast : public std::logic_error { explicit fail_fast(char const* const message) : std::logic_error(message) {} }; -} +namespace details +{ +template +[[noreturn]] void throw_exception(Exception&& exception); + +} //namespace details +} //namespace gsl #if defined(GSL_THROW_ON_CONTRACT_VIOLATION) +namespace gsl +{ +namespace details +{ +template +[[noreturn]] void throw_exception(Exception&& exception) +{ + throw exception; +} + +} //namespace details +} //namespace gsl + #define GSL_CONTRACT_CHECK(type, cond) \ (GSL_LIKELY(cond) ? static_cast(0) \ - : throw gsl::fail_fast("GSL: " type " failure at " __FILE__ \ - ": " GSL_STRINGIFY(__LINE__))) + : gsl::throw_exception(gsl::fail_fast("GSL: " type " failure at " __FILE__ \ + ": " GSL_STRINGIFY(__LINE__)))) #elif defined(GSL_TERMINATE_ON_CONTRACT_VIOLATION) #define GSL_CONTRACT_CHECK(type, cond) (GSL_LIKELY(cond) ? static_cast(0) : std::terminate()) +namespace gsl +{ +namespace details +{ +template +[[noreturn]] void throw_exception(Exception&& exception) +{ + static_cast(exception); + std::terminate(); +} + +} //namespace details +} //namespace gsl + + #define GSL_CONTRACT_CHECK(type, cond) \ + (GSL_LIKELY(cond) ? static_cast(0) : std::terminate()) + #elif defined(GSL_UNENFORCED_ON_CONTRACT_VIOLATION) #define GSL_CONTRACT_CHECK(type, cond) GSL_ASSUME(cond) diff --git a/include/gsl/gsl_util b/include/gsl/gsl_util index 7f3218d..0d7a09c 100644 --- a/include/gsl/gsl_util +++ b/include/gsl/gsl_util @@ -121,9 +121,9 @@ template inline T narrow(U u) { T t = narrow_cast(u); - if (static_cast(t) != u) throw narrowing_error(); + if (static_cast(t) != u) gsl::details::throw_exception(narrowing_error()); if (!details::is_same_signedness::value && ((t < T{}) != (u < U{}))) - throw narrowing_error(); + gsl::details::throw_exception(narrowing_error()); return t; }