1 // { dg-options "-std=gnu++17 -lstdc++fs" } 2 // { dg-do run { target c++17 } } 3 // { dg-require-filesystem-ts "" } 4 5 // Copyright (C) 2014-2018 Free Software Foundation, Inc. 6 // 7 // This file is part of the GNU ISO C++ Library. This library is free 8 // software; you can redistribute it and/or modify it under the 9 // terms of the GNU General Public License as published by the 10 // Free Software Foundation; either version 3, or (at your option) 11 // any later version. 12 13 // This library is distributed in the hope that it will be useful, 14 // but WITHOUT ANY WARRANTY; without even the implied warranty of 15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 // GNU General Public License for more details. 17 18 // You should have received a copy of the GNU General Public License along 19 // with this library; see the file COPYING3. If not see 20 // <http://www.gnu.org/licenses/>. 21 22 // C++17 30.10.14.1 Absolute [fs.op.absolute] 23 24 #include <filesystem> 25 #include <testsuite_fs.h> 26 #include <testsuite_hooks.h> 27 28 using std::filesystem::path; 29 30 void test01()31test01() 32 { 33 for (const path& p : __gnu_test::test_paths) 34 { 35 std::error_code ec; 36 path abs = absolute(p, ec); 37 VERIFY( ec || abs.is_absolute() ); 38 } 39 } 40 41 void test02()42test02() 43 { 44 path p1("/"); 45 VERIFY( absolute(p1) == p1 ); 46 path p2("/foo"); 47 VERIFY( absolute(p2) == p2 ); 48 path p3("foo"); 49 VERIFY( absolute(p3) != p3 ); 50 VERIFY( absolute(p3) == (std::filesystem::current_path()/p3) ); 51 } 52 53 void test03()54test03() 55 { 56 // PR libstdc++/90299 57 const path p = __gnu_test::nonexistent_path(); 58 std::error_code ec; 59 const path pabs = absolute(p, ec); 60 VERIFY( !ec ); 61 VERIFY( pabs.is_absolute() ); 62 63 const path pabs2 = absolute(p); 64 VERIFY( pabs2 == pabs ); 65 66 const path eabs = absolute(path{}, ec); 67 VERIFY( ec == std::errc::invalid_argument ); 68 VERIFY( eabs.empty() ); 69 70 try { 71 absolute(path{}); 72 VERIFY( false ); 73 } catch (const std::filesystem::filesystem_error& e) { 74 VERIFY( e.code() == std::errc::invalid_argument ); 75 VERIFY( e.path1().empty() ); 76 VERIFY( e.path2().empty() ); 77 } 78 } 79 80 int main()81main() 82 { 83 test01(); 84 test02(); 85 test03(); 86 } 87