1e78f53d1SNikolas Klauser // -*- C++ -*- 2e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===// 3e78f53d1SNikolas Klauser // 4e78f53d1SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5e78f53d1SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 6e78f53d1SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7e78f53d1SNikolas Klauser // 8e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===// 9e78f53d1SNikolas Klauser 10*ce777190SNikolas Klauser #ifndef _LIBCPP___CXX03___FILESYSTEM_FILESYSTEM_ERROR_H 11*ce777190SNikolas Klauser #define _LIBCPP___CXX03___FILESYSTEM_FILESYSTEM_ERROR_H 12e78f53d1SNikolas Klauser 1373fbae83SNikolas Klauser #include <__cxx03/__config> 1473fbae83SNikolas Klauser #include <__cxx03/__filesystem/path.h> 1573fbae83SNikolas Klauser #include <__cxx03/__memory/shared_ptr.h> 1673fbae83SNikolas Klauser #include <__cxx03/__system_error/error_code.h> 1773fbae83SNikolas Klauser #include <__cxx03/__system_error/system_error.h> 1873fbae83SNikolas Klauser #include <__cxx03/__utility/forward.h> 1973fbae83SNikolas Klauser #include <__cxx03/__verbose_abort> 2073fbae83SNikolas Klauser #include <__cxx03/string> 21e78f53d1SNikolas Klauser 22e78f53d1SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 23e78f53d1SNikolas Klauser # pragma GCC system_header 24e78f53d1SNikolas Klauser #endif 25e78f53d1SNikolas Klauser 26e78f53d1SNikolas Klauser #if _LIBCPP_STD_VER >= 17 27e78f53d1SNikolas Klauser 28e78f53d1SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM 29e78f53d1SNikolas Klauser 30e78f53d1SNikolas Klauser class _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY _LIBCPP_EXPORTED_FROM_ABI filesystem_error : public system_error { 31e78f53d1SNikolas Klauser public: 32e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI filesystem_error(const string& __what, error_code __ec) 33e78f53d1SNikolas Klauser : system_error(__ec, __what), __storage_(make_shared<_Storage>(path(), path())) { 34e78f53d1SNikolas Klauser __create_what(0); 35e78f53d1SNikolas Klauser } 36e78f53d1SNikolas Klauser 37e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI filesystem_error(const string& __what, const path& __p1, error_code __ec) 38e78f53d1SNikolas Klauser : system_error(__ec, __what), __storage_(make_shared<_Storage>(__p1, path())) { 39e78f53d1SNikolas Klauser __create_what(1); 40e78f53d1SNikolas Klauser } 41e78f53d1SNikolas Klauser 42e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI filesystem_error(const string& __what, const path& __p1, const path& __p2, error_code __ec) 43e78f53d1SNikolas Klauser : system_error(__ec, __what), __storage_(make_shared<_Storage>(__p1, __p2)) { 44e78f53d1SNikolas Klauser __create_what(2); 45e78f53d1SNikolas Klauser } 46e78f53d1SNikolas Klauser 47e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI const path& path1() const noexcept { return __storage_->__p1_; } 48e78f53d1SNikolas Klauser 49e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI const path& path2() const noexcept { return __storage_->__p2_; } 50e78f53d1SNikolas Klauser 51e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI filesystem_error(const filesystem_error&) = default; 52e78f53d1SNikolas Klauser ~filesystem_error() override; // key function 53e78f53d1SNikolas Klauser 54e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL 55e78f53d1SNikolas Klauser const char* what() const noexcept override { return __storage_->__what_.c_str(); } 56e78f53d1SNikolas Klauser 57e78f53d1SNikolas Klauser void __create_what(int __num_paths); 58e78f53d1SNikolas Klauser 59e78f53d1SNikolas Klauser private: 60e78f53d1SNikolas Klauser struct _LIBCPP_HIDDEN _Storage { 61e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _Storage(const path& __p1, const path& __p2) : __p1_(__p1), __p2_(__p2) {} 62e78f53d1SNikolas Klauser 63e78f53d1SNikolas Klauser path __p1_; 64e78f53d1SNikolas Klauser path __p2_; 65e78f53d1SNikolas Klauser string __what_; 66e78f53d1SNikolas Klauser }; 67e78f53d1SNikolas Klauser shared_ptr<_Storage> __storage_; 68e78f53d1SNikolas Klauser }; 69e78f53d1SNikolas Klauser 70e78f53d1SNikolas Klauser # ifndef _LIBCPP_HAS_NO_EXCEPTIONS 71e78f53d1SNikolas Klauser template <class... _Args> 72e78f53d1SNikolas Klauser _LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY void 73e78f53d1SNikolas Klauser __throw_filesystem_error(_Args&&... __args) { 74e78f53d1SNikolas Klauser throw filesystem_error(std::forward<_Args>(__args)...); 75e78f53d1SNikolas Klauser } 76e78f53d1SNikolas Klauser # else 77e78f53d1SNikolas Klauser template <class... _Args> 78e78f53d1SNikolas Klauser _LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY void 79e78f53d1SNikolas Klauser __throw_filesystem_error(_Args&&...) { 80e78f53d1SNikolas Klauser _LIBCPP_VERBOSE_ABORT("filesystem_error was thrown in -fno-exceptions mode"); 81e78f53d1SNikolas Klauser } 82e78f53d1SNikolas Klauser # endif 83e78f53d1SNikolas Klauser 84e78f53d1SNikolas Klauser _LIBCPP_END_NAMESPACE_FILESYSTEM 85e78f53d1SNikolas Klauser 86e78f53d1SNikolas Klauser #endif // _LIBCPP_STD_VER >= 17 87e78f53d1SNikolas Klauser 88*ce777190SNikolas Klauser #endif // _LIBCPP___CXX03___FILESYSTEM_FILESYSTEM_ERROR_H 89