xref: /llvm-project/libcxx/include/__cxx03/__filesystem/filesystem_error.h (revision ce7771902dc50d900de639d499a60486b83f70e0)
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