Tested aarch64-linux. Pushed to trunk. -- >8 --
I forgot to 'git add' these files in the commit that added the new member function to basic_filebuf. libstdc++-v3/ChangeLog: * testsuite/27_io/basic_filebuf/native_handle/char/1.cc: New test. * testsuite/27_io/basic_filebuf/native_handle/wchar_t/1.cc: New test. --- .../basic_filebuf/native_handle/char/1.cc | 61 +++++++++++++++++++ .../basic_filebuf/native_handle/wchar_t/1.cc | 55 +++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 libstdc++-v3/testsuite/27_io/basic_filebuf/native_handle/char/1.cc create mode 100644 libstdc++-v3/testsuite/27_io/basic_filebuf/native_handle/wchar_t/1.cc diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/native_handle/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/native_handle/char/1.cc new file mode 100644 index 00000000000..749451a4c81 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/native_handle/char/1.cc @@ -0,0 +1,61 @@ +// { dg-options "-fno-inline" } +// { dg-do run { target c++26 } } +// { dg-additional-files "filebuf_members-1.txt" } + +#include <fstream> + +#ifndef __cpp_lib_fstream_native_handle +# error "Feature-test macro for fstream_native_handle missing in <fstream>" +#elif __cpp_lib_fstream_native_handle != 202306L +# error "Feature-test macro for fstream_native_handle has wrong value in <fstream>" +#endif + +using type = std::basic_filebuf<char>::native_handle_type; + +#include <cstdio> // std::fclose(FILE*) +#if __has_include(<unistd.h>) +# include <unistd.h> // close(int) +#endif +#if __has_include(<handleapi.h>) +# include <handleapi.h> // CloseHandle(HANDLE) +#endif + +#include <testsuite_hooks.h> + +void +test01() +{ + std::filebuf f; + f.open("filebuf_members-1.txt", std::ios::in); + type handle = f.native_handle(); + + auto native_close = []<typename HandleT>(HandleT handle) { + if constexpr (std::is_same_v<HandleT, std::FILE*>) + std::fclose(handle); // --enable-cstdio=stdio_pure +#if __has_include(<unistd.h>) + else if constexpr (std::is_same_v<HandleT, int>) + ::close(handle); // POSIX +#endif +#if __has_include(<handleapi.h>) + else if constexpr (std::is_same_v<HandleT, void*>) + ::CloseHandle(handle); // Windows +#endif + else + VERIFY( false ); + }; + native_close(handle); + + try + { + f.sgetc(); + VERIFY( false ); + } + catch (const std::ios::failure&) + { + } +} + +int main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/native_handle/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/native_handle/wchar_t/1.cc new file mode 100644 index 00000000000..7ee5e4e8f53 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/native_handle/wchar_t/1.cc @@ -0,0 +1,55 @@ +// { dg-options "-fno-inline" } +// { dg-do run { target c++26 } } +// { dg-additional-files "filebuf_members-1.txt" } + +#include <fstream> + +using type = std::basic_filebuf<wchar_t>::native_handle_type; + +#include <cstdio> // std::fclose(FILE*) +#if __has_include(<unistd.h>) +# include <unistd.h> // close(int) +#endif +#if __has_include(<handleapi.h>) +# include <handleapi.h> // CloseHandle(HANDLE) +#endif + +#include <testsuite_hooks.h> + +void +test01() +{ + std::wfilebuf f; + f.open("filebuf_members-1.txt", std::wios::in); + type handle = f.native_handle(); + + auto native_close = []<typename HandleT>(HandleT handle) { + if constexpr (std::is_same_v<HandleT, std::FILE*>) + std::fclose(handle); // --enable-cstdio=stdio_pure +#if __has_include(<unistd.h>) + else if constexpr (std::is_same_v<HandleT, int>) + ::close(handle); // POSIX +#endif +#if __has_include(<handleapi.h>) + else if constexpr (std::is_same_v<HandleT, void*>) + ::CloseHandle(handle); // Windows +#endif + else + VERIFY( false ); + }; + native_close(handle); + + try + { + f.sgetc(); + VERIFY( false ); + } + catch (const std::ios::failure&) + { + } +} + +int main() +{ + test01(); +} -- 2.41.0