When a handle to an error_category singleton object is used during the termination phase of a program, the destruction of the error_category object may have occurred prior to execution of the current destructor or function registered with atexit, because the singleton object may have been constructed after the corresponding initialization or call to atexit. For example, the updated tests from this patch will fail if using a libc++ built using a compiler that updates the vtable of the object on destruction. This patch attempts to avoid the issue by causing the destructor to not be called in the style of ResourceInitHelper in src/experimental/memory_resource.cpp. This approach might not work if object lifetime is strictly enforced. Differential Revision: https://reviews.llvm.org/D65667 Co-authored-by: Louis Dionne <ldionne.2@gmail.com>
38 lines
1.2 KiB
C++
38 lines
1.2 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// 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 <__config>
|
|
|
|
#ifdef _LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS
|
|
# define _LIBCPP_ERROR_CATEGORY_DEFINE_LEGACY_INLINE_FUNCTIONS
|
|
#endif
|
|
|
|
#include <system_error>
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
|
|
// class error_category
|
|
|
|
#if defined(_LIBCPP_ERROR_CATEGORY_DEFINE_LEGACY_INLINE_FUNCTIONS)
|
|
error_category::error_category() noexcept {}
|
|
#endif
|
|
|
|
error_category::~error_category() noexcept {}
|
|
|
|
error_condition error_category::default_error_condition(int ev) const noexcept { return error_condition(ev, *this); }
|
|
|
|
bool error_category::equivalent(int code, const error_condition& condition) const noexcept {
|
|
return default_error_condition(code) == condition;
|
|
}
|
|
|
|
bool error_category::equivalent(const error_code& code, int condition) const noexcept {
|
|
return *this == code.category() && code.value() == condition;
|
|
}
|
|
|
|
_LIBCPP_END_NAMESPACE_STD
|