17056250fSNikolas Klauser // -*- C++ -*- 27056250fSNikolas Klauser //===----------------------------------------------------------------------===// 37056250fSNikolas Klauser // 47056250fSNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 57056250fSNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 67056250fSNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 77056250fSNikolas Klauser // 87056250fSNikolas Klauser //===----------------------------------------------------------------------===// 97056250fSNikolas Klauser 107056250fSNikolas Klauser #ifndef _LIBCPP___FILESYSTEM_FILESYSTEM_ERROR_H 117056250fSNikolas Klauser #define _LIBCPP___FILESYSTEM_FILESYSTEM_ERROR_H 127056250fSNikolas Klauser 137056250fSNikolas Klauser #include <__config> 147056250fSNikolas Klauser #include <__filesystem/path.h> 157056250fSNikolas Klauser #include <__memory/shared_ptr.h> 16e8cfbfd0SMark de Wever #include <__system_error/error_code.h> 17e8cfbfd0SMark de Wever #include <__system_error/system_error.h> 18d5e26775SNikolas Klauser #include <__utility/forward.h> 1916d1b0e1SNikolas Klauser #include <__verbose_abort> 20e8cfbfd0SMark de Wever #include <string> 217056250fSNikolas Klauser 22fa6b9e40SArthur O'Dwyer #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 23fa6b9e40SArthur O'Dwyer # pragma GCC system_header 24fa6b9e40SArthur O'Dwyer #endif 25fa6b9e40SArthur O'Dwyer 26ac8c9f1eSLouis Dionne #if _LIBCPP_STD_VER >= 17 277056250fSNikolas Klauser 287056250fSNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM 297056250fSNikolas Klauser 30f1ea0b11SNikolas Klauser class _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY _LIBCPP_EXPORTED_FROM_ABI filesystem_error : public system_error { 317056250fSNikolas Klauser public: 32333384c5SLouis Dionne _LIBCPP_HIDE_FROM_ABI filesystem_error(const string& __what, error_code __ec) 33333384c5SLouis Dionne : system_error(__ec, __what), __storage_(make_shared<_Storage>(path(), path())) { 347056250fSNikolas Klauser __create_what(0); 357056250fSNikolas Klauser } 367056250fSNikolas Klauser 37333384c5SLouis Dionne _LIBCPP_HIDE_FROM_ABI filesystem_error(const string& __what, const path& __p1, error_code __ec) 38333384c5SLouis Dionne : system_error(__ec, __what), __storage_(make_shared<_Storage>(__p1, path())) { 397056250fSNikolas Klauser __create_what(1); 407056250fSNikolas Klauser } 417056250fSNikolas Klauser 42333384c5SLouis Dionne _LIBCPP_HIDE_FROM_ABI filesystem_error(const string& __what, const path& __p1, const path& __p2, error_code __ec) 43333384c5SLouis Dionne : system_error(__ec, __what), __storage_(make_shared<_Storage>(__p1, __p2)) { 447056250fSNikolas Klauser __create_what(2); 457056250fSNikolas Klauser } 467056250fSNikolas Klauser 47333384c5SLouis Dionne _LIBCPP_HIDE_FROM_ABI const path& path1() const noexcept { return __storage_->__p1_; } 487056250fSNikolas Klauser 49333384c5SLouis Dionne _LIBCPP_HIDE_FROM_ABI const path& path2() const noexcept { return __storage_->__p2_; } 507056250fSNikolas Klauser 5183ce1397SNikolas Klauser _LIBCPP_HIDE_FROM_ABI filesystem_error(const filesystem_error&) = default; 527056250fSNikolas Klauser ~filesystem_error() override; // key function 537056250fSNikolas Klauser 545efc8116SLouis Dionne _LIBCPP_HIDE_FROM_ABI_VIRTUAL 55333384c5SLouis Dionne const char* what() const noexcept override { return __storage_->__what_.c_str(); } 567056250fSNikolas Klauser 577056250fSNikolas Klauser void __create_what(int __num_paths); 587056250fSNikolas Klauser 597056250fSNikolas Klauser private: 607056250fSNikolas Klauser struct _LIBCPP_HIDDEN _Storage { 61333384c5SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Storage(const path& __p1, const path& __p2) : __p1_(__p1), __p2_(__p2) {} 627056250fSNikolas Klauser 637056250fSNikolas Klauser path __p1_; 647056250fSNikolas Klauser path __p2_; 657056250fSNikolas Klauser string __what_; 667056250fSNikolas Klauser }; 677056250fSNikolas Klauser shared_ptr<_Storage> __storage_; 687056250fSNikolas Klauser }; 697056250fSNikolas Klauser 70*ba87515fSNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 71333384c5SLouis Dionne template <class... _Args> 72748023dcSNikolas Klauser [[__noreturn__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY void 73c352fa74SLouis Dionne __throw_filesystem_error(_Args&&... __args) { 7477a00c0dSLouis Dionne throw filesystem_error(std::forward<_Args>(__args)...); 757056250fSNikolas Klauser } 767056250fSNikolas Klauser # else 77333384c5SLouis Dionne template <class... _Args> 78748023dcSNikolas Klauser [[__noreturn__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY void 79c352fa74SLouis Dionne __throw_filesystem_error(_Args&&...) { 80308bcb3fSNikolas Klauser _LIBCPP_VERBOSE_ABORT("filesystem_error was thrown in -fno-exceptions mode"); 817056250fSNikolas Klauser } 827056250fSNikolas Klauser # endif 837056250fSNikolas Klauser 847056250fSNikolas Klauser _LIBCPP_END_NAMESPACE_FILESYSTEM 857056250fSNikolas Klauser 86ac8c9f1eSLouis Dionne #endif // _LIBCPP_STD_VER >= 17 877056250fSNikolas Klauser 887056250fSNikolas Klauser #endif // _LIBCPP___FILESYSTEM_FILESYSTEM_ERROR_H 89