1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // UNSUPPORTED: availability-filesystem-missing 10 // UNSUPPORTED: c++03, c++11, c++14 11 12 // <filesystem> 13 14 // class filesystem_error 15 16 // filesystem_error(const string& what_arg, error_code ec); 17 // filesystem_error(const string& what_arg, const path& p1, error_code ec); 18 // filesystem_error(const string& what_arg, const path& p1, const path& p2, error_code ec); 19 // const std::error_code& code() const; 20 // const char* what() const noexcept; 21 // const path& path1() const noexcept; 22 // const path& path2() const noexcept; 23 24 #include <filesystem> 25 #include <cassert> 26 #include <string> 27 #include <system_error> 28 #include <type_traits> 29 30 #include "test_macros.h" 31 namespace fs = std::filesystem; 32 33 void test_constructors() { 34 using namespace fs; 35 36 { 37 // The string returned by "filesystem_error::what() must contain runtime_error::what().c_str() 38 const std::string what_arg = "Hello World"; 39 const std::string what_contains = std::runtime_error(what_arg).what(); 40 assert(what_contains.find(what_arg) != std::string::npos); 41 auto CheckWhat = [what_contains](filesystem_error const& e) { 42 std::string s = e.what(); 43 assert(s.find(what_contains.c_str()) != std::string::npos); 44 }; 45 46 std::error_code ec = std::make_error_code(std::errc::file_exists); 47 const path p1("foo"); 48 const path p2("bar"); 49 50 // filesystem_error(const string& what_arg, error_code ec); 51 { 52 ASSERT_NOT_NOEXCEPT(filesystem_error(what_arg, ec)); 53 filesystem_error e(what_arg, ec); 54 CheckWhat(e); 55 assert(e.code() == ec); 56 assert(e.path1().empty() && e.path2().empty()); 57 } 58 // filesystem_error(const string& what_arg, const path&, error_code ec); 59 { 60 ASSERT_NOT_NOEXCEPT(filesystem_error(what_arg, p1, ec)); 61 filesystem_error e(what_arg, p1, ec); 62 CheckWhat(e); 63 assert(e.code() == ec); 64 assert(e.path1() == p1); 65 assert(e.path2().empty()); 66 } 67 // filesystem_error(const string& what_arg, const path&, const path&, error_code ec); 68 { 69 ASSERT_NOT_NOEXCEPT(filesystem_error(what_arg, p1, p2, ec)); 70 filesystem_error e(what_arg, p1, p2, ec); 71 CheckWhat(e); 72 assert(e.code() == ec); 73 assert(e.path1() == p1); 74 assert(e.path2() == p2); 75 } 76 } 77 { 78 // The string returned by "filesystem_error::what() must contain runtime_error::what().c_str() 79 const std::string what_arg("test LWG3112 with and With embedded \0 character"); 80 const std::string what_contains = std::runtime_error(what_arg).what(); 81 assert(what_contains.find(what_arg) != std::string::npos); 82 auto CheckWhat = [what_contains](filesystem_error const& e) { 83 std::string s = e.what(); 84 assert(s.find(what_contains.c_str()) != std::string::npos); 85 }; 86 87 std::error_code ec = std::make_error_code(std::errc::file_exists); 88 const path p1("foo"); 89 const path p2("bar"); 90 91 // filesystem_error(const string& what_arg, error_code ec); 92 { 93 ASSERT_NOT_NOEXCEPT(filesystem_error(what_arg, ec)); 94 filesystem_error e(what_arg, ec); 95 CheckWhat(e); 96 assert(e.code() == ec); 97 assert(e.path1().empty() && e.path2().empty()); 98 } 99 // filesystem_error(const string& what_arg, const path&, error_code ec); 100 { 101 ASSERT_NOT_NOEXCEPT(filesystem_error(what_arg, p1, ec)); 102 filesystem_error e(what_arg, p1, ec); 103 CheckWhat(e); 104 assert(e.code() == ec); 105 assert(e.path1() == p1); 106 assert(e.path2().empty()); 107 } 108 // filesystem_error(const string& what_arg, const path&, const path&, error_code ec); 109 { 110 ASSERT_NOT_NOEXCEPT(filesystem_error(what_arg, p1, p2, ec)); 111 filesystem_error e(what_arg, p1, p2, ec); 112 CheckWhat(e); 113 assert(e.code() == ec); 114 assert(e.path1() == p1); 115 assert(e.path2() == p2); 116 } 117 } 118 } 119 120 void test_signatures() { 121 using namespace fs; 122 const path p; 123 std::error_code ec; 124 const filesystem_error e("lala", ec); 125 // const path& path1() const noexcept; 126 { 127 ASSERT_SAME_TYPE(path const&, decltype(e.path1())); 128 ASSERT_NOEXCEPT(e.path1()); 129 } 130 // const path& path2() const noexcept 131 { 132 ASSERT_SAME_TYPE(path const&, decltype(e.path2())); 133 ASSERT_NOEXCEPT(e.path2()); 134 } 135 // const char* what() const noexcept 136 { 137 ASSERT_SAME_TYPE(const char*, decltype(e.what())); 138 ASSERT_NOEXCEPT(e.what()); 139 } 140 } 141 142 int main(int, char**) { 143 static_assert(std::is_base_of<std::system_error, fs::filesystem_error>::value, ""); 144 test_constructors(); 145 test_signatures(); 146 147 return 0; 148 } 149