1*4bdff4beSrobert // -*- C++ -*-
2*4bdff4beSrobert //===----------------------------------------------------------------------===//
3*4bdff4beSrobert //
4*4bdff4beSrobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*4bdff4beSrobert // See https://llvm.org/LICENSE.txt for license information.
6*4bdff4beSrobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*4bdff4beSrobert //
8*4bdff4beSrobert //===----------------------------------------------------------------------===//
9*4bdff4beSrobert
10*4bdff4beSrobert #ifndef _LIBCPP___FILESYSTEM_FILESYSTEM_ERROR_H
11*4bdff4beSrobert #define _LIBCPP___FILESYSTEM_FILESYSTEM_ERROR_H
12*4bdff4beSrobert
13*4bdff4beSrobert #include <__availability>
14*4bdff4beSrobert #include <__config>
15*4bdff4beSrobert #include <__filesystem/path.h>
16*4bdff4beSrobert #include <__memory/shared_ptr.h>
17*4bdff4beSrobert #include <__utility/forward.h>
18*4bdff4beSrobert #include <iosfwd>
19*4bdff4beSrobert #include <new>
20*4bdff4beSrobert #include <system_error>
21*4bdff4beSrobert #include <type_traits>
22*4bdff4beSrobert
23*4bdff4beSrobert #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
24*4bdff4beSrobert # pragma GCC system_header
25*4bdff4beSrobert #endif
26*4bdff4beSrobert
27*4bdff4beSrobert #ifndef _LIBCPP_CXX03_LANG
28*4bdff4beSrobert
29*4bdff4beSrobert _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM
30*4bdff4beSrobert
31*4bdff4beSrobert class _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_EXCEPTION_ABI filesystem_error : public system_error {
32*4bdff4beSrobert public:
33*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY
filesystem_error(const string & __what,error_code __ec)34*4bdff4beSrobert filesystem_error(const string& __what, error_code __ec)
35*4bdff4beSrobert : system_error(__ec, __what),
36*4bdff4beSrobert __storage_(make_shared<_Storage>(path(), path())) {
37*4bdff4beSrobert __create_what(0);
38*4bdff4beSrobert }
39*4bdff4beSrobert
40*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY
filesystem_error(const string & __what,const path & __p1,error_code __ec)41*4bdff4beSrobert filesystem_error(const string& __what, const path& __p1, error_code __ec)
42*4bdff4beSrobert : system_error(__ec, __what),
43*4bdff4beSrobert __storage_(make_shared<_Storage>(__p1, path())) {
44*4bdff4beSrobert __create_what(1);
45*4bdff4beSrobert }
46*4bdff4beSrobert
47*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY
filesystem_error(const string & __what,const path & __p1,const path & __p2,error_code __ec)48*4bdff4beSrobert filesystem_error(const string& __what, const path& __p1, const path& __p2,
49*4bdff4beSrobert error_code __ec)
50*4bdff4beSrobert : system_error(__ec, __what),
51*4bdff4beSrobert __storage_(make_shared<_Storage>(__p1, __p2)) {
52*4bdff4beSrobert __create_what(2);
53*4bdff4beSrobert }
54*4bdff4beSrobert
55*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY
path1()56*4bdff4beSrobert const path& path1() const noexcept { return __storage_->__p1_; }
57*4bdff4beSrobert
58*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY
path2()59*4bdff4beSrobert const path& path2() const noexcept { return __storage_->__p2_; }
60*4bdff4beSrobert
61*4bdff4beSrobert filesystem_error(const filesystem_error&) = default;
62*4bdff4beSrobert ~filesystem_error() override; // key function
63*4bdff4beSrobert
64*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI_VIRTUAL
what()65*4bdff4beSrobert const char* what() const noexcept override {
66*4bdff4beSrobert return __storage_->__what_.c_str();
67*4bdff4beSrobert }
68*4bdff4beSrobert
69*4bdff4beSrobert void __create_what(int __num_paths);
70*4bdff4beSrobert
71*4bdff4beSrobert private:
72*4bdff4beSrobert struct _LIBCPP_HIDDEN _Storage {
73*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY
_Storage_Storage74*4bdff4beSrobert _Storage(const path& __p1, const path& __p2) : __p1_(__p1), __p2_(__p2) {}
75*4bdff4beSrobert
76*4bdff4beSrobert path __p1_;
77*4bdff4beSrobert path __p2_;
78*4bdff4beSrobert string __what_;
79*4bdff4beSrobert };
80*4bdff4beSrobert shared_ptr<_Storage> __storage_;
81*4bdff4beSrobert };
82*4bdff4beSrobert
83*4bdff4beSrobert // TODO(ldionne): We need to pop the pragma and push it again after
84*4bdff4beSrobert // filesystem_error to work around PR41078.
85*4bdff4beSrobert _LIBCPP_AVAILABILITY_FILESYSTEM_PUSH
86*4bdff4beSrobert
87*4bdff4beSrobert template <class... _Args>
88*4bdff4beSrobert _LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
89*4bdff4beSrobert #ifndef _LIBCPP_NO_EXCEPTIONS
__throw_filesystem_error(_Args &&...__args)90*4bdff4beSrobert void __throw_filesystem_error(_Args&&... __args) {
91*4bdff4beSrobert throw filesystem_error(_VSTD::forward<_Args>(__args)...);
92*4bdff4beSrobert }
93*4bdff4beSrobert #else
94*4bdff4beSrobert void __throw_filesystem_error(_Args&&...) {
95*4bdff4beSrobert _VSTD::abort();
96*4bdff4beSrobert }
97*4bdff4beSrobert #endif
98*4bdff4beSrobert _LIBCPP_AVAILABILITY_FILESYSTEM_POP
99*4bdff4beSrobert
100*4bdff4beSrobert _LIBCPP_END_NAMESPACE_FILESYSTEM
101*4bdff4beSrobert
102*4bdff4beSrobert #endif // _LIBCPP_CXX03_LANG
103*4bdff4beSrobert
104*4bdff4beSrobert #endif // _LIBCPP___FILESYSTEM_FILESYSTEM_ERROR_H
105