[libcxx-commits] [libcxx] [libc++] Implement LWG3430 disallow implicit conversion of the source arguments to `std::filesystem::path` when constructing `std::basic_*fstream` (PR #85079)
Mark de Wever via libcxx-commits
libcxx-commits at lists.llvm.org
Fri Apr 5 09:50:28 PDT 2024
================
@@ -17,18 +17,49 @@
// template <class charT, class traits = char_traits<charT> >
// class basic_ifstream
-// explicit basic_ifstream(const filesystem::path& s,
-// ios_base::openmode mode = ios_base::in);
+// template<class T>
+// explicit basic_ifstream(const T& s, ios_base::openmode mode = ios_base::in); // Since C++17
+// Constraints: is_same_v<T, filesystem::path> is true
#include <cassert>
#include <filesystem>
#include <fstream>
#include <type_traits>
#include "test_macros.h"
+#include "test_iterators.h"
namespace fs = std::filesystem;
+template <class CharT>
+constexpr bool test_non_convert_to_path() {
+ // String types
+ static_assert(!std::is_constructible_v<std::ifstream, std::basic_string_view<CharT>>);
+ static_assert(!std::is_constructible_v<std::ifstream, const std::basic_string_view<CharT>>);
+
+ // Char* pointers
+ if constexpr (!std::is_same_v<CharT, char>)
+ static_assert(!std::is_constructible_v<std::ifstream, const CharT*>);
+
+ // Iterators
+ static_assert(!std::is_convertible_v<std::ifstream, cpp17_input_iterator<const CharT*>>);
+
+ return true;
+}
+
+static_assert(test_non_convert_to_path<char>());
+
+#if !defined(TEST_HAS_NO_WIDE_CHARACTERS) && !defined(_LIBCPP_HAS_OPEN_WITH_WCHAR)
----------------
mordante wrote:
We try to avoid `_LIBCPP_xxx` macros in our test suite. Instead we add a helper macro in `test/support/test_macros.h`. For example search for `TEST_HAS_NO_WIDE_CHARACTERS` in that file. Can you do the same for `_LIBCPP_HAS_OPEN_WITH_WCHAR`?
Please update all tests.
https://github.com/llvm/llvm-project/pull/85079
More information about the libcxx-commits
mailing list