112 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++1410 11// <fstream>12 13// plate <class charT, class traits = char_traits<charT> >14// class basic_fstream15 16// template<class T>17// explicit basic_fstream(const T& s, ios_base::openmode mode = ios_base::in); // Since C++1718// Constraints: is_same_v<T, filesystem::path> is true19 20#include <fstream>21#include <filesystem>22#include <cassert>23#include <type_traits>24 25#include "test_macros.h"26#include "test_iterators.h"27#include "platform_support.h"28#include "operator_hijacker.h"29 30namespace fs = std::filesystem;31 32template <class CharT>33constexpr bool test_non_convert_to_path() {34 // String types35 static_assert(!std::is_constructible_v<std::fstream, std::basic_string_view<CharT>>);36 static_assert(!std::is_constructible_v<std::fstream, const std::basic_string_view<CharT>>);37 38 // Char* pointers39 if constexpr (!std::is_same_v<CharT, char> && !std::is_same_v<CharT, fs::path::value_type>)40 static_assert(!std::is_constructible_v<std::fstream, const CharT*>);41 42 // Iterators43 static_assert(!std::is_convertible_v<std::fstream, cpp17_input_iterator<const CharT*>>);44 45 return true;46}47 48static_assert(test_non_convert_to_path<char>());49 50#if !defined(TEST_HAS_NO_WIDE_CHARACTERS) && !defined(TEST_HAS_OPEN_WITH_WCHAR)51static_assert(test_non_convert_to_path<wchar_t>());52#endif // !TEST_HAS_NO_WIDE_CHARACTERS && !TEST_HAS_OPEN_WITH_WCHAR53 54#ifndef TEST_HAS_NO_CHAR8_T55static_assert(test_non_convert_to_path<char8_t>());56#endif // TEST_HAS_NO_CHAR8_T57 58static_assert(test_non_convert_to_path<char16_t>());59static_assert(test_non_convert_to_path<char32_t>());60 61int main(int, char**) {62 fs::path p = get_temp_file_name();63 {64 std::fstream fs(p, std::ios_base::in | std::ios_base::out |65 std::ios_base::trunc);66 double x = 0;67 fs << 3.25;68 fs.seekg(0);69 fs >> x;70 assert(x == 3.25);71 }72 std::remove(p.string().c_str());73 74 {75 std::basic_fstream<char, operator_hijacker_char_traits<char> > fs(76 p, std::ios_base::in | std::ios_base::out | std::ios_base::trunc);77 std::basic_string<char, operator_hijacker_char_traits<char> > x;78 fs << "3.25";79 fs.seekg(0);80 fs >> x;81 assert(x == "3.25");82 }83 std::remove(p.string().c_str());84 85#ifndef TEST_HAS_NO_WIDE_CHARACTERS86 {87 std::wfstream fs(p, std::ios_base::in | std::ios_base::out |88 std::ios_base::trunc);89 double x = 0;90 fs << 3.25;91 fs.seekg(0);92 fs >> x;93 assert(x == 3.25);94 }95 std::remove(p.string().c_str());96 97 {98 std::basic_fstream<wchar_t, operator_hijacker_char_traits<wchar_t> > fs(99 p, std::ios_base::in | std::ios_base::out | std::ios_base::trunc);100 std::basic_string<wchar_t, operator_hijacker_char_traits<wchar_t> > x;101 fs << L"3.25";102 fs.seekg(0);103 fs >> x;104 assert(x == L"3.25");105 }106 std::remove(p.string().c_str());107 108#endif109 110 return 0;111}112