*/
class error_code
{
+ template<typename _ErrorCodeEnum>
+ using _Check
+ = __enable_if_t<is_error_code_enum<_ErrorCodeEnum>::value>;
+
public:
error_code() noexcept
: _M_value(0), _M_cat(&system_category()) { }
error_code(int __v, const error_category& __cat) noexcept
: _M_value(__v), _M_cat(&__cat) { }
- template<typename _ErrorCodeEnum, typename = typename
- enable_if<is_error_code_enum<_ErrorCodeEnum>::value>::type>
+ /// Initialize with a user-defined type, by calling make_error_code.
+ template<typename _ErrorCodeEnum,
+ typename = _Check<_ErrorCodeEnum>>
error_code(_ErrorCodeEnum __e) noexcept
{ *this = make_error_code(__e); }
+ error_code(const error_code&) = default;
+ error_code& operator=(const error_code&) = default;
+
void
assign(int __v, const error_category& __cat) noexcept
{
clear() noexcept
{ assign(0, system_category()); }
- // DR 804.
- template<typename _ErrorCodeEnum>
- typename enable_if<is_error_code_enum<_ErrorCodeEnum>::value,
- error_code&>::type
- operator=(_ErrorCodeEnum __e) noexcept
- { return *this = make_error_code(__e); }
-
/// The error value.
[[__nodiscard__]]
int
*/
class error_condition
{
+ template<typename _ErrorConditionEnum>
+ using _Check
+ = __enable_if_t<is_error_condition_enum<_ErrorConditionEnum>::value>;
+
public:
/// Initialize with a zero (no error) value and the generic category.
error_condition() noexcept
error_condition(int __v, const error_category& __cat) noexcept
: _M_value(__v), _M_cat(&__cat) { }
- template<typename _ErrorConditionEnum, typename = typename
- enable_if<is_error_condition_enum<_ErrorConditionEnum>::value>::type>
+ /// Initialize with a user-defined type, by calling make_error_condition.
+ template<typename _ErrorConditionEnum,
+ typename = _Check<_ErrorConditionEnum>>
error_condition(_ErrorConditionEnum __e) noexcept
{ *this = make_error_condition(__e); }
+ error_condition(const error_condition&) = default;
+ error_condition& operator=(const error_condition&) = default;
+
/// Set the value and category.
void
assign(int __v, const error_category& __cat) noexcept
_M_cat = &__cat;
}
- // DR 804.
- template<typename _ErrorConditionEnum>
- typename enable_if<is_error_condition_enum
- <_ErrorConditionEnum>::value, error_condition&>::type
- operator=(_ErrorConditionEnum __e) noexcept
- { return *this = make_error_condition(__e); }
-
/// Reset the value and category to the default-constructed state.
void
clear() noexcept
#include <system_error>
#include <testsuite_error.h>
+namespace adl
+{
+ struct Error { };
+
+ const Error err;
+
+ struct category : std::error_category
+ {
+ const char* name() const noexcept override { return "adl"; }
+ std::string message(int) const { return ""; }
+ };
+
+ const category cat;
+
+ std::error_code
+ make_error_code(Error) { return std::error_code(999, cat); }
+}
+
+template<> struct std::is_error_code_enum<adl::Error> : std::true_type { };
+
int main()
{
- // 1
+ // 1 error_code()
std::error_code e1;
VERIFY( e1.value() == 0 );
VERIFY( e1.category() == std::system_category() );
- // 2
+ // 2 error_code(int, const error_category&)
const __gnu_test::test_category cat;
std::error_code e2(e1.value(), cat);
VERIFY( e2.value() == e1.value() );
VERIFY( e2.category() == cat );
- // 3
+ // 3 error_code(const error_code&)
std::error_code e3(std::make_error_code(std::errc::operation_not_supported));
VERIFY( e3.value() == int(std::errc::operation_not_supported) );
VERIFY( e3.category() == std::generic_category() );
- return 0;
+ // 4 error_code(ErrorCodeEnum)
+ std::error_code e4(adl::err);
+ VERIFY( e4.value() == 999 );
+ VERIFY( e4.category() == adl::cat );
}
#include <system_error>
#include <testsuite_error.h>
+namespace adl
+{
+ struct Error { };
+
+ const Error err;
+
+ struct category : std::error_category
+ {
+ const char* name() const noexcept override { return "adl"; }
+ std::string message(int) const { return ""; }
+ };
+
+ const category cat;
+
+ std::error_condition
+ make_error_condition(Error) { return std::error_condition(999, cat); }
+}
+
+template<> struct std::is_error_condition_enum<adl::Error> : std::true_type { };
+
void test01()
{
- // 1
+ // 1 error_condition()
std::error_condition e1;
VERIFY( e1.value() == 0 );
VERIFY( e1.category() == std::generic_category() );
- // 2
+ // 2 error_condition(int, const error_category&)
const __gnu_test::test_category cat;
std::error_condition e2(e1.value(), cat);
VERIFY( e2.value() == e1.value() );
VERIFY( e2.category() == cat );
- // 3
+ // 3 error_condition(const error_condition&)
std::error_condition e3(std::errc::operation_not_supported);
VERIFY( e3.value() == int(std::errc::operation_not_supported) );
VERIFY( e3.category() == std::generic_category() );
+
+ // 4 error_condition(ErrorConditionEnum)
+ std::error_condition e4(adl::err);
+ VERIFY( e4.value() == 999 );
+ VERIFY( e4.category() == adl::cat );
}
int main()