From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 8E5F03858D35 for ; Fri, 15 Sep 2023 23:09:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8E5F03858D35 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1694819368; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=8HSeCtdJoxAxDwjq8Rye7lFn7rxLj4cZ1Ag5kiHufiQ=; b=K4vy7mWHELWUHO8ammCVdCnB4xRD87hHZ+wIgcR+zCTVKjv7zh/SdtdbJd02LyqjHTNFH1 l5fqBa+OYnZmdQRpWw0QiDb73Dv5Zcyh65idBfxDVO/rEksEZ/I1oV/xiR8KFwmd0Jg+VT uF2KSzetwLpKpDMlmIIYNq/Dx0bgoT4= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-6-EAZDCMAdNiCuwFIR_ORguw-1; Fri, 15 Sep 2023 19:09:25 -0400 X-MC-Unique: EAZDCMAdNiCuwFIR_ORguw-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 7DB078116B2; Fri, 15 Sep 2023 23:09:25 +0000 (UTC) Received: from localhost (unknown [10.42.28.190]) by smtp.corp.redhat.com (Postfix) with ESMTP id E2B271054FC3; Fri, 15 Sep 2023 23:09:24 +0000 (UTC) From: Jonathan Wakely To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [committed] libstdc++: Implement C++26 native handles for file streams (P1759R6) Date: Sat, 16 Sep 2023 00:06:57 +0100 Message-ID: <20230915230924.2328645-1-jwakely@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE,TXREP,URIBL_BLACK autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Tested aarch64-linux. Pushed to trunk. -- >8 -- The new __basic_file::native_handle() function can be added for C++11 and above, because the names "native_handle" and "native_handle_type" are already reserved since C++11. Exporting those symbols from the shared library does no harm, even if the feature gets dropped before the C++23 standard is final. The new member functions of std::fstream etc. are only declared for C++26 and so are not instantiated in src/c++11/fstream-inst.cc. Declare them with the always_inline attribute so that no symbol definitions are needed in the library (we can change this later when C++26 support is less experimental). libstdc++-v3/ChangeLog: * acinclude.m4 (GLIBCXX_CHECK_FILEBUF_NATIVE_HANDLES): New macro. * config.h.in: Regenerate. * config/abi/pre/gnu.ver (GLIBCXX_3.4.32): Export new basic_filebuf members. * config/io/basic_file_stdio.cc (__basic_file::native_handle): Define new function. * config/io/basic_file_stdio.h (__basic_file::native_handle): Declare new function. * configure: Regenerate. * configure.ac: Use GLIBCXX_CHECK_FILEBUF_NATIVE_HANDLES. * include/bits/version.def (fstream_native_handles): New macro. * include/bits/version.h: Regenerate. * include/std/fstream (basic_filebuf::native_handle) (basic_fstream::native_handle, basic_ifstream::native_handle) (basic_ofstream::native_handle): New functions. * src/c++11/Makefile.am: Move compilation of basic_file.cc, locale_init.cc and localename.cc to here. * src/c++11/Makefile.in: Regenerate. * src/c++98/locale_init.cc: Moved to... * src/c++11/locale_init.cc: ...here. * src/c++98/localename.cc: Moved to... * src/c++11/localename.cc: ...here. * src/c++98/Makefile.am: Remove basic_file.cc, locale_init.cc and localename.cc from here. * src/c++98/Makefile.in: Regenerate. * testsuite/27_io/basic_filebuf/native_handle/version.cc: New test. * testsuite/27_io/basic_fstream/native_handle/char/1.cc: New test. * testsuite/27_io/basic_fstream/native_handle/wchar_t/1.cc: New test. * testsuite/27_io/basic_ifstream/native_handle/char/1.cc: New test. * testsuite/27_io/basic_ifstream/native_handle/wchar_t/1.cc: New test. * testsuite/27_io/basic_ofstream/native_handle/char/1.cc: New test. * testsuite/27_io/basic_ofstream/native_handle/wchar_t/1.cc: New test. --- libstdc++-v3/acinclude.m4 | 31 ++++++++++ libstdc++-v3/config.h.in | 3 + libstdc++-v3/config/abi/pre/gnu.ver | 2 + libstdc++-v3/config/io/basic_file_stdio.cc | 18 ++++++ libstdc++-v3/config/io/basic_file_stdio.h | 13 ++++ libstdc++-v3/configure | 57 ++++++++++++++++++ libstdc++-v3/configure.ac | 3 + libstdc++-v3/include/bits/version.def | 9 +++ libstdc++-v3/include/bits/version.h | 13 +++- libstdc++-v3/include/std/fstream | 60 +++++++++++++++++++ libstdc++-v3/src/c++11/Makefile.am | 21 ++++++- libstdc++-v3/src/c++11/Makefile.in | 40 ++++++++++--- .../src/{c++98 => c++11}/locale_init.cc | 0 .../src/{c++98 => c++11}/localename.cc | 0 libstdc++-v3/src/c++98/Makefile.am | 22 ++----- libstdc++-v3/src/c++98/Makefile.in | 39 ++++-------- .../basic_filebuf/native_handle/version.cc | 10 ++++ .../basic_fstream/native_handle/char/1.cc | 21 +++++++ .../basic_fstream/native_handle/wchar_t/1.cc | 21 +++++++ .../basic_ifstream/native_handle/char/1.cc | 21 +++++++ .../basic_ifstream/native_handle/wchar_t/1.cc | 21 +++++++ .../basic_ofstream/native_handle/char/1.cc | 21 +++++++ .../basic_ofstream/native_handle/wchar_t/1.cc | 21 +++++++ 23 files changed, 411 insertions(+), 56 deletions(-) rename libstdc++-v3/src/{c++98 => c++11}/locale_init.cc (100%) rename libstdc++-v3/src/{c++98 => c++11}/localename.cc (100%) create mode 100644 libstdc++-v3/testsuite/27_io/basic_filebuf/native_handle/version.cc create mode 100644 libstdc++-v3/testsuite/27_io/basic_fstream/native_handle/char/1.cc create mode 100644 libstdc++-v3/testsuite/27_io/basic_fstream/native_handle/wchar_t/1.cc create mode 100644 libstdc++-v3/testsuite/27_io/basic_ifstream/native_handle/char/1.cc create mode 100644 libstdc++-v3/testsuite/27_io/basic_ifstream/native_handle/wchar_t/1.cc create mode 100644 libstdc++-v3/testsuite/27_io/basic_ofstream/native_handle/char/1.cc create mode 100644 libstdc++-v3/testsuite/27_io/basic_ofstream/native_handle/wchar_t/1.cc diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index 34faa3c049f..d8f0ba1c3e2 100644 --- a/libstdc++-v3/acinclude.m4 +++ b/libstdc++-v3/acinclude.m4 @@ -5786,6 +5786,37 @@ AC_LANG_SAVE AC_LANG_RESTORE ]) +dnl +dnl Check whether the Windows CRT function _get_osfhandle is available. +dnl +dnl Defines: +dnl _GLIBCXX_USE__GET_OSFHANDLE if _get_osfhandle is in for Windows. +dnl +AC_DEFUN([GLIBCXX_CHECK_FILEBUF_NATIVE_HANDLES], [ +AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + AC_MSG_CHECKING([whether _get_osfhandle is defined in ]) + AC_TRY_COMPILE([ + #if defined(_WIN32) && !defined(__CYGWIN__) + # include + # include + #endif + ],[ + FILE* file = 0; + int fd = fileno(file); + intptr_t crt_handle = _get_osfhandle(fd); + void* win32_handle = reinterpret_cast(crt_handle); + ], [ac_get_osfhandle=yes], [ac_get_osfhandle=no]) + if test "$ac_objext" = yes; then + AC_DEFINE_UNQUOTED(_GLIBCXX_USE__GET_OSFHANDLE, 1, + [Define if _get_osfhandle should be used for filebuf::native_handle().]) + fi + AC_MSG_RESULT($ac_get_osfhandle) + + AC_LANG_RESTORE +]) + # Macros from the top-level gcc directory. m4_include([../config/gc++filt.m4]) m4_include([../config/tls.m4]) diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in index 0abe62a98da..4af7339673c 100644 --- a/libstdc++-v3/config.h.in +++ b/libstdc++-v3/config.h.in @@ -1095,6 +1095,9 @@ /* Defined if Sleep exists. */ #undef _GLIBCXX_USE_WIN32_SLEEP +/* Define if _get_osfhandle should be used for filebuf::native_handle(). */ +#undef _GLIBCXX_USE__GET_OSFHANDLE + /* Define to 1 if a verbose library is built, or 0 otherwise. */ #undef _GLIBCXX_VERBOSE diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver index a2e5f3b4e74..15b50d51251 100644 --- a/libstdc++-v3/config/abi/pre/gnu.ver +++ b/libstdc++-v3/config/abi/pre/gnu.ver @@ -2519,6 +2519,8 @@ GLIBCXX_3.4.31 { GLIBCXX_3.4.32 { _ZSt21ios_base_library_initv; _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE11_S_allocateERS3_[jmy]; + # std::basic_file<>::native_handle() + _ZNKSt12__basic_fileI[cw]E13native_handleEv; } GLIBCXX_3.4.31; # Symbols in the support library (libsupc++) have their own tag. diff --git a/libstdc++-v3/config/io/basic_file_stdio.cc b/libstdc++-v3/config/io/basic_file_stdio.cc index 7b1729a798f..a33b53b3b27 100644 --- a/libstdc++-v3/config/io/basic_file_stdio.cc +++ b/libstdc++-v3/config/io/basic_file_stdio.cc @@ -66,6 +66,11 @@ #include // For ::max() and min() and ::max() +#if _GLIBCXX_USE__GET_OSFHANDLE +# include // For intptr_t +# include // For _get_osfhandle +#endif + namespace { // Map ios_base::openmode flags to a string for use in fopen(). @@ -460,6 +465,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return 0; } + __basic_file::native_handle_type + __basic_file::native_handle() const noexcept + { +#ifdef _GLIBCXX_USE_STDIO_PURE + return _M_cfile; +#elif _GLIBCXX_USE__GET_OSFHANDLE + const intptr_t handle = _M_cfile ? _get_osfhandle(fileno(_M_cfile)) : -1; + return reinterpret_cast(handle); +#else + return fileno(_M_cfile); +#endif + } + _GLIBCXX_END_NAMESPACE_VERSION } // namespace diff --git a/libstdc++-v3/config/io/basic_file_stdio.h b/libstdc++-v3/config/io/basic_file_stdio.h index 29bd6531940..7b735654adb 100644 --- a/libstdc++-v3/config/io/basic_file_stdio.h +++ b/libstdc++-v3/config/io/basic_file_stdio.h @@ -127,6 +127,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION streamsize showmanyc(); + +#if __cplusplus >= 201103L +#ifdef _GLIBCXX_USE_STDIO_PURE + using native_handle_type = __c_file*; // FILE* +#elif _GLIBCXX_USE__GET_OSFHANDLE + using native_handle_type = void*; // HANDLE +#else + using native_handle_type = int; // POSIX file descriptor +#endif + + native_handle_type + native_handle() const noexcept; +#endif }; _GLIBCXX_END_NAMESPACE_VERSION diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure index 9ac6771372c..13fc03b2a3f 100755 --- a/libstdc++-v3/configure +++ b/libstdc++-v3/configure @@ -73906,6 +73906,63 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu +# For __basic_file::native_handle() + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether _get_osfhandle is defined in " >&5 +$as_echo_n "checking whether _get_osfhandle is defined in ... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #if defined(_WIN32) && !defined(__CYGWIN__) + # include + # include + #endif + +int +main () +{ + + FILE* file = 0; + int fd = fileno(file); + intptr_t crt_handle = _get_osfhandle(fd); + void* win32_handle = reinterpret_cast(crt_handle); + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_get_osfhandle=yes +else + ac_get_osfhandle=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test "$ac_objext" = yes; then + +cat >>confdefs.h <<_ACEOF +#define _GLIBCXX_USE__GET_OSFHANDLE 1 +_ACEOF + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_get_osfhandle" >&5 +$as_echo "$ac_get_osfhandle" >&6; } + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + # Define documentation rules conditionally. # See if makeinfo has been installed and is modern enough diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac index fc0f2522027..b3991ccab48 100644 --- a/libstdc++-v3/configure.ac +++ b/libstdc++-v3/configure.ac @@ -553,6 +553,9 @@ GLIBCXX_CHECK_ALIGNAS_CACHELINE # For using init_priority in ios_init.cc GLIBCXX_CHECK_INIT_PRIORITY +# For __basic_file::native_handle() +GLIBCXX_CHECK_FILEBUF_NATIVE_HANDLES + # Define documentation rules conditionally. # See if makeinfo has been installed and is modern enough diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def index b7d17c91c34..6252f5478e0 100644 --- a/libstdc++-v3/include/bits/version.def +++ b/libstdc++-v3/include/bits/version.def @@ -1598,6 +1598,15 @@ ftms = { }; }; +ftms = { + name = fstream_native_handle; + values = { + v = 202306; + cxxmin = 26; + hosted = yes; + }; +}; + ftms = { name = ratio; values = { diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h index 82adda221c2..782198acc0c 100644 --- a/libstdc++-v3/include/bits/version.h +++ b/libstdc++-v3/include/bits/version.h @@ -1956,6 +1956,17 @@ #undef __glibcxx_want_string_resize_and_overwrite // from version.def line 1602 +#if !defined(__cpp_lib_fstream_native_handle) +# if (__cplusplus > 202302L) && _GLIBCXX_HOSTED +# define __glibcxx_fstream_native_handle 202306L +# if defined(__glibcxx_want_all) || defined(__glibcxx_want_fstream_native_handle) +# define __cpp_lib_fstream_native_handle 202306L +# endif +# endif +#endif /* !defined(__cpp_lib_fstream_native_handle) && defined(__glibcxx_want_fstream_native_handle) */ +#undef __glibcxx_want_fstream_native_handle + +// from version.def line 1611 #if !defined(__cpp_lib_ratio) # if (__cplusplus > 202302L) # define __glibcxx_ratio 202306L @@ -1966,7 +1977,7 @@ #endif /* !defined(__cpp_lib_ratio) && defined(__glibcxx_want_ratio) */ #undef __glibcxx_want_ratio -// from version.def line 1610 +// from version.def line 1619 #if !defined(__cpp_lib_to_string) # if (__cplusplus > 202302L) && _GLIBCXX_HOSTED && (__glibcxx_to_chars) # define __glibcxx_to_string 202306L diff --git a/libstdc++-v3/include/std/fstream b/libstdc++-v3/include/std/fstream index 3dff4e5e74e..f68fffc39bd 100644 --- a/libstdc++-v3/include/std/fstream +++ b/libstdc++-v3/include/std/fstream @@ -46,6 +46,9 @@ #include // For std::string overloads. #endif +#define __glibcxx_want_fstream_native_handle +#include + // This can be overridden by the target's os_defines.h #ifndef _GLIBCXX_BUFSIZ # define _GLIBCXX_BUFSIZ BUFSIZ @@ -367,6 +370,36 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __filebuf_type* close(); +#if __cpp_lib_fstream_native_handle // C++ >= 26 + /** + * @brief The platform-specific file handle type. + * + * The type is `int` for POSIX platforms that use file descriptors, + * or `HANDLE` for Windows, or `FILE*` if the library was configured + * with `--enable-cstdio=stdio_pure`. + * + * @since C++26 + */ + using native_handle_type = typename __file_type::native_handle_type; + + /** + * @brief Return the platform-specific native handle for the file. + * @pre `is_open()` is true. + * @return The native file handle associated with `*this`. + * + * The handle is invalidated when this filebuf is closed or destroyed. + * + * @since C++26 + */ + [[__gnu__::__always_inline__]] + native_handle_type + native_handle() const noexcept + { + __glibcxx_assert(is_open()); + return _M_file.native_handle(); + } +#endif + protected: void _M_allocate_internal_buffer(); @@ -739,6 +772,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION if (!_M_filebuf.close()) this->setstate(ios_base::failbit); } + +#if __cpp_lib_fstream_native_handle // C++ >= 26 + using native_handle_type = typename __filebuf_type::native_handle_type; + + [[__gnu__::__always_inline__]] + native_handle_type + native_handle() const noexcept + { return _M_filebuf.native_handle(); } +#endif }; @@ -1002,6 +1044,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION if (!_M_filebuf.close()) this->setstate(ios_base::failbit); } + +#if __cpp_lib_fstream_native_handle // C++ >= 26 + using native_handle_type = typename __filebuf_type::native_handle_type; + + [[__gnu__::__always_inline__]] + native_handle_type + native_handle() const noexcept + { return _M_filebuf.native_handle(); } +#endif }; @@ -1262,6 +1313,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION if (!_M_filebuf.close()) this->setstate(ios_base::failbit); } + +#if __cpp_lib_fstream_native_handle // C++ >= 26 + using native_handle_type = typename __filebuf_type::native_handle_type; + + [[__gnu__::__always_inline__]] + native_handle_type + native_handle() const noexcept + { return _M_filebuf.native_handle(); } +#endif }; #if __cplusplus >= 201103L diff --git a/libstdc++-v3/src/c++11/Makefile.am b/libstdc++-v3/src/c++11/Makefile.am index e7495dcccef..9cddb978928 100644 --- a/libstdc++-v3/src/c++11/Makefile.am +++ b/libstdc++-v3/src/c++11/Makefile.am @@ -39,6 +39,14 @@ ctype_configure_char.cc: ${glibcxx_srcdir}/$(OS_INC_SRCDIR)/ctype_configure_char ctype_members.cc: ${glibcxx_srcdir}/$(CCTYPE_CC) $(LN_S) ${glibcxx_srcdir}/$(CCTYPE_CC) . || true +# Source files linked in via configuration/make substitution for a +# particular host, but with ad hoc naming rules. +host_sources_extra = \ + basic_file.cc + +basic_file.cc: ${glibcxx_srcdir}/$(BASIC_FILE_CC) + $(LN_S) ${glibcxx_srcdir}/$(BASIC_FILE_CC) ./$@ || true + if ENABLE_DUAL_ABI cxx11_abi_sources = \ cow-locale_init.cc \ @@ -71,6 +79,8 @@ sources = \ hashtable_c++0x.cc \ ios.cc \ ios_errcat.cc \ + locale_init.cc \ + localename.cc \ mutex.cc \ random.cc \ regex.cc \ @@ -79,7 +89,8 @@ sources = \ system_error.cc \ thread.cc \ ${cxx11_abi_sources} \ - ${host_sources} + ${host_sources} \ + ${host_sources_extra} if ENABLE_DUAL_ABI extra_string_inst_sources = \ @@ -147,6 +158,14 @@ limits.lo: limits.cc $(LTCXXCOMPILE) -fchar8_t -c $< limits.o: limits.cc $(CXXCOMPILE) -fchar8_t -c $< +locale_init.lo: locale_init.cc + $(LTCXXCOMPILE) -std=gnu++11 -fchar8_t -c $< +locale_init.o: locale_init.cc + $(CXXCOMPILE) -std=gnu++11 -fchar8_t -c $< +localename.lo: localename.cc + $(LTCXXCOMPILE) -std=gnu++11 -fchar8_t -c $< +localename.o: localename.cc + $(CXXCOMPILE) -std=gnu++11 -fchar8_t -c $< if ENABLE_DUAL_ABI # Rewrite the type info for __ios_failure. diff --git a/libstdc++-v3/src/c++11/Makefile.in b/libstdc++-v3/src/c++11/Makefile.in index a10e05977bc..e6d37c5464c 100644 --- a/libstdc++-v3/src/c++11/Makefile.in +++ b/libstdc++-v3/src/c++11/Makefile.in @@ -127,20 +127,22 @@ am__objects_1 = limits.lo placeholders.lo @ENABLE_DUAL_ABI_TRUE@ cxx11-ios_failure.lo \ @ENABLE_DUAL_ABI_TRUE@ cxx11-shim_facets.lo cxx11-stdexcept.lo am__objects_3 = ctype_configure_char.lo ctype_members.lo -am__objects_4 = assert_fail.lo chrono.lo codecvt.lo \ +am__objects_4 = basic_file.lo +am__objects_5 = assert_fail.lo chrono.lo codecvt.lo \ condition_variable.lo cow-stdexcept.lo ctype.lo debug.lo \ functexcept.lo functional.lo futex.lo future.lo hash_c++0x.lo \ - hashtable_c++0x.lo ios.lo ios_errcat.lo mutex.lo random.lo \ - regex.lo shared_ptr.lo snprintf_lite.lo system_error.lo \ - thread.lo $(am__objects_2) $(am__objects_3) -@ENABLE_DUAL_ABI_TRUE@am__objects_5 = cow-fstream-inst.lo \ + hashtable_c++0x.lo ios.lo ios_errcat.lo locale_init.lo \ + localename.lo mutex.lo random.lo regex.lo shared_ptr.lo \ + snprintf_lite.lo system_error.lo thread.lo $(am__objects_2) \ + $(am__objects_3) $(am__objects_4) +@ENABLE_DUAL_ABI_TRUE@am__objects_6 = cow-fstream-inst.lo \ @ENABLE_DUAL_ABI_TRUE@ cow-sstream-inst.lo cow-string-inst.lo \ @ENABLE_DUAL_ABI_TRUE@ cow-string-io-inst.lo \ @ENABLE_DUAL_ABI_TRUE@ cow-wstring-inst.lo \ @ENABLE_DUAL_ABI_TRUE@ cow-wstring-io-inst.lo \ @ENABLE_DUAL_ABI_TRUE@ cxx11-locale-inst.lo \ @ENABLE_DUAL_ABI_TRUE@ cxx11-wlocale-inst.lo sso_string.lo -@ENABLE_EXTERN_TEMPLATE_TRUE@am__objects_6 = $(am__objects_5) \ +@ENABLE_EXTERN_TEMPLATE_TRUE@am__objects_7 = $(am__objects_6) \ @ENABLE_EXTERN_TEMPLATE_TRUE@ ext11-inst.lo fstream-inst.lo \ @ENABLE_EXTERN_TEMPLATE_TRUE@ ios-inst.lo iostream-inst.lo \ @ENABLE_EXTERN_TEMPLATE_TRUE@ istream-inst.lo locale-inst.lo \ @@ -152,8 +154,8 @@ am__objects_4 = assert_fail.lo chrono.lo codecvt.lo \ @GLIBCXX_HOSTED_FALSE@am_libc__11convenience_la_OBJECTS = \ @GLIBCXX_HOSTED_FALSE@ $(am__objects_1) @GLIBCXX_HOSTED_TRUE@am_libc__11convenience_la_OBJECTS = \ -@GLIBCXX_HOSTED_TRUE@ $(am__objects_1) $(am__objects_4) \ -@GLIBCXX_HOSTED_TRUE@ $(am__objects_6) +@GLIBCXX_HOSTED_TRUE@ $(am__objects_1) $(am__objects_5) \ +@GLIBCXX_HOSTED_TRUE@ $(am__objects_7) libc__11convenience_la_OBJECTS = $(am_libc__11convenience_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -461,6 +463,12 @@ host_sources = \ ctype_configure_char.cc \ ctype_members.cc + +# Source files linked in via configuration/make substitution for a +# particular host, but with ad hoc naming rules. +host_sources_extra = \ + basic_file.cc + @ENABLE_DUAL_ABI_FALSE@cxx11_abi_sources = @ENABLE_DUAL_ABI_TRUE@cxx11_abi_sources = \ @ENABLE_DUAL_ABI_TRUE@ cow-locale_init.cc \ @@ -490,6 +498,8 @@ sources = \ hashtable_c++0x.cc \ ios.cc \ ios_errcat.cc \ + locale_init.cc \ + localename.cc \ mutex.cc \ random.cc \ regex.cc \ @@ -498,7 +508,8 @@ sources = \ system_error.cc \ thread.cc \ ${cxx11_abi_sources} \ - ${host_sources} + ${host_sources} \ + ${host_sources_extra} @ENABLE_DUAL_ABI_FALSE@extra_string_inst_sources = @ENABLE_DUAL_ABI_TRUE@extra_string_inst_sources = \ @@ -854,6 +865,9 @@ ctype_configure_char.cc: ${glibcxx_srcdir}/$(OS_INC_SRCDIR)/ctype_configure_char ctype_members.cc: ${glibcxx_srcdir}/$(CCTYPE_CC) $(LN_S) ${glibcxx_srcdir}/$(CCTYPE_CC) . || true +basic_file.cc: ${glibcxx_srcdir}/$(BASIC_FILE_CC) + $(LN_S) ${glibcxx_srcdir}/$(BASIC_FILE_CC) ./$@ || true + vpath % $(top_srcdir)/src/c++11 # Use special rules for the hashtable.cc file so that all @@ -872,6 +886,14 @@ limits.lo: limits.cc $(LTCXXCOMPILE) -fchar8_t -c $< limits.o: limits.cc $(CXXCOMPILE) -fchar8_t -c $< +locale_init.lo: locale_init.cc + $(LTCXXCOMPILE) -std=gnu++11 -fchar8_t -c $< +locale_init.o: locale_init.cc + $(CXXCOMPILE) -std=gnu++11 -fchar8_t -c $< +localename.lo: localename.cc + $(LTCXXCOMPILE) -std=gnu++11 -fchar8_t -c $< +localename.o: localename.cc + $(CXXCOMPILE) -std=gnu++11 -fchar8_t -c $< @ENABLE_DUAL_ABI_TRUE@cxx11-ios_failure-lt.s: cxx11-ios_failure.cc @ENABLE_DUAL_ABI_TRUE@ $(LTCXXCOMPILE) -gno-as-loc-support -S $< -o tmp-cxx11-ios_failure-lt.s diff --git a/libstdc++-v3/src/c++98/locale_init.cc b/libstdc++-v3/src/c++11/locale_init.cc similarity index 100% rename from libstdc++-v3/src/c++98/locale_init.cc rename to libstdc++-v3/src/c++11/locale_init.cc diff --git a/libstdc++-v3/src/c++98/localename.cc b/libstdc++-v3/src/c++11/localename.cc similarity index 100% rename from libstdc++-v3/src/c++98/localename.cc rename to libstdc++-v3/src/c++11/localename.cc diff --git a/libstdc++-v3/src/c++98/Makefile.am b/libstdc++-v3/src/c++98/Makefile.am index 284ffda3443..72be2d2d2ea 100644 --- a/libstdc++-v3/src/c++98/Makefile.am +++ b/libstdc++-v3/src/c++98/Makefile.am @@ -81,15 +81,11 @@ endif # Source files linked in via configuration/make substitution for a # particular host, but with ad hoc naming rules. host_sources_extra = \ - basic_file.cc c++locale.cc \ - ${inst_sources} ${parallel_sources} + c++locale.cc c++locale.cc: ${glibcxx_srcdir}/$(CLOCALE_CC) $(LN_S) ${glibcxx_srcdir}/$(CLOCALE_CC) ./$@ || true -basic_file.cc: ${glibcxx_srcdir}/$(BASIC_FILE_CC) - $(LN_S) ${glibcxx_srcdir}/$(BASIC_FILE_CC) ./$@ || true - if ENABLE_DUAL_ABI cxx11_abi_sources = \ cow-istream-string.cc @@ -130,9 +126,7 @@ sources = \ list_associated.cc \ list_associated-2.cc \ locale.cc \ - locale_init.cc \ locale_facets.cc \ - localename.cc \ math_stubs_float.cc \ math_stubs_long_double.cc \ stdexcept.cc \ @@ -144,7 +138,9 @@ sources = \ valarray.cc \ ${cxx11_abi_sources} \ ${host_sources} \ - ${host_sources_extra} + ${host_sources_extra} \ + ${inst_sources} \ + ${parallel_sources} vpath % $(top_srcdir)/src/c++98 @@ -181,16 +177,6 @@ numeric_members_cow.o: numeric_members_cow.cc $(CXXCOMPILE) $(GLIBCXX_ABI_FLAGS) -fimplicit-templates -c $< endif -# XXX TODO move locale_init.cc and localename.cc to src/c++11 -locale_init.lo: locale_init.cc - $(LTCXXCOMPILE) -std=gnu++11 -fchar8_t -c $< -locale_init.o: locale_init.cc - $(CXXCOMPILE) -std=gnu++11 -fchar8_t -c $< -localename.lo: localename.cc - $(LTCXXCOMPILE) -std=gnu++11 -fchar8_t -c $< -localename.o: localename.cc - $(CXXCOMPILE) -std=gnu++11 -fchar8_t -c $< - # Use special rules for the deprecated source files so that they find # deprecated include files. GLIBCXX_INCLUDE_DIR=$(glibcxx_builddir)/include diff --git a/libstdc++-v3/src/c++98/Makefile.in b/libstdc++-v3/src/c++98/Makefile.in index a100df77a6d..95e909b1049 100644 --- a/libstdc++-v3/src/c++98/Makefile.in +++ b/libstdc++-v3/src/c++98/Makefile.in @@ -129,21 +129,20 @@ libc__98convenience_la_LIBADD = am__objects_3 = $(am__objects_2) codecvt_members.lo collate_members.lo \ messages_members.lo monetary_members.lo numeric_members.lo \ time_members.lo -@ENABLE_EXTERN_TEMPLATE_TRUE@am__objects_4 = allocator-inst.lo \ +am__objects_4 = c++locale.lo +@ENABLE_EXTERN_TEMPLATE_TRUE@am__objects_5 = allocator-inst.lo \ @ENABLE_EXTERN_TEMPLATE_TRUE@ concept-inst.lo ext-inst.lo \ @ENABLE_EXTERN_TEMPLATE_TRUE@ misc-inst.lo -am__objects_5 = parallel_settings.lo -am__objects_6 = basic_file.lo c++locale.lo $(am__objects_4) \ - $(am__objects_5) +am__objects_6 = parallel_settings.lo am__objects_7 = bitmap_allocator.lo pool_allocator.lo mt_allocator.lo \ codecvt.lo complex_io.lo globals_io.lo hash_tr1.lo \ hashtable_tr1.lo ios_failure.lo ios_init.lo ios_locale.lo \ list.lo list-aux.lo list-aux-2.lo list_associated.lo \ - list_associated-2.lo locale.lo locale_init.lo locale_facets.lo \ - localename.lo math_stubs_float.lo math_stubs_long_double.lo \ - stdexcept.lo strstream.lo tree.lo istream.lo istream-string.lo \ - streambuf.lo valarray.lo $(am__objects_1) $(am__objects_3) \ - $(am__objects_6) + list_associated-2.lo locale.lo locale_facets.lo \ + math_stubs_float.lo math_stubs_long_double.lo stdexcept.lo \ + strstream.lo tree.lo istream.lo istream-string.lo streambuf.lo \ + valarray.lo $(am__objects_1) $(am__objects_3) $(am__objects_4) \ + $(am__objects_5) $(am__objects_6) @GLIBCXX_HOSTED_TRUE@am_libc__98convenience_la_OBJECTS = \ @GLIBCXX_HOSTED_TRUE@ $(am__objects_7) libc__98convenience_la_OBJECTS = $(am_libc__98convenience_la_OBJECTS) @@ -468,8 +467,7 @@ host_sources = \ # Source files linked in via configuration/make substitution for a # particular host, but with ad hoc naming rules. host_sources_extra = \ - basic_file.cc c++locale.cc \ - ${inst_sources} ${parallel_sources} + c++locale.cc @ENABLE_DUAL_ABI_FALSE@cxx11_abi_sources = @ENABLE_DUAL_ABI_TRUE@cxx11_abi_sources = \ @@ -506,9 +504,7 @@ sources = \ list_associated.cc \ list_associated-2.cc \ locale.cc \ - locale_init.cc \ locale_facets.cc \ - localename.cc \ math_stubs_float.cc \ math_stubs_long_double.cc \ stdexcept.cc \ @@ -520,7 +516,9 @@ sources = \ valarray.cc \ ${cxx11_abi_sources} \ ${host_sources} \ - ${host_sources_extra} + ${host_sources_extra} \ + ${inst_sources} \ + ${parallel_sources} @GLIBCXX_HOSTED_FALSE@libc__98convenience_la_SOURCES = @GLIBCXX_HOSTED_TRUE@libc__98convenience_la_SOURCES = $(sources) @@ -871,9 +869,6 @@ time_members.cc: ${glibcxx_srcdir}/$(CTIME_CC) c++locale.cc: ${glibcxx_srcdir}/$(CLOCALE_CC) $(LN_S) ${glibcxx_srcdir}/$(CLOCALE_CC) ./$@ || true -basic_file.cc: ${glibcxx_srcdir}/$(BASIC_FILE_CC) - $(LN_S) ${glibcxx_srcdir}/$(BASIC_FILE_CC) ./$@ || true - vpath % $(top_srcdir)/src/c++98 # Use special rules to compile with -fimplicit-templates. @@ -898,16 +893,6 @@ c++locale.o: c++locale.cc @ENABLE_DUAL_ABI_TRUE@ $(LTCXXCOMPILE) $(GLIBCXX_ABI_FLAGS) -fimplicit-templates -c $< @ENABLE_DUAL_ABI_TRUE@numeric_members_cow.o: numeric_members_cow.cc @ENABLE_DUAL_ABI_TRUE@ $(CXXCOMPILE) $(GLIBCXX_ABI_FLAGS) -fimplicit-templates -c $< - -# XXX TODO move locale_init.cc and localename.cc to src/c++11 -locale_init.lo: locale_init.cc - $(LTCXXCOMPILE) -std=gnu++11 -fchar8_t -c $< -locale_init.o: locale_init.cc - $(CXXCOMPILE) -std=gnu++11 -fchar8_t -c $< -localename.lo: localename.cc - $(LTCXXCOMPILE) -std=gnu++11 -fchar8_t -c $< -localename.o: localename.cc - $(CXXCOMPILE) -std=gnu++11 -fchar8_t -c $< strstream.lo: strstream.cc $(LTCXXCOMPILE) -I$(GLIBCXX_INCLUDE_DIR)/backward -Wno-deprecated -c $< strstream.o: strstream.cc diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/native_handle/version.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/native_handle/version.cc new file mode 100644 index 00000000000..46c400d12ce --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/native_handle/version.cc @@ -0,0 +1,10 @@ +// { dg-do preprocess { target c++26 } } +// { dg-require-effective-target hosted } + +#include + +#ifndef __cpp_lib_fstream_native_handle +# error "Feature-test macro for fstream_native_handle missing in " +#elif __cpp_lib_fstream_native_handle != 202306L +# error "Feature-test macro for fstream_native_handle has wrong value in " +#endif diff --git a/libstdc++-v3/testsuite/27_io/basic_fstream/native_handle/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_fstream/native_handle/char/1.cc new file mode 100644 index 00000000000..a0e6557186b --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_fstream/native_handle/char/1.cc @@ -0,0 +1,21 @@ +// { dg-options "-fno-inline" } +// { dg-do run { target c++26 } } +// { dg-additional-files "filebuf_members-1.txt" } + +#include +#include + +void +test01() +{ + static_assert( std::is_same_v ); + std::fstream f; + f.open("filebuf_members-1.txt", std::ios::in); + VERIFY( f.native_handle() == f.rdbuf()->native_handle() ); +} + +int main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/27_io/basic_fstream/native_handle/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_fstream/native_handle/wchar_t/1.cc new file mode 100644 index 00000000000..fe9395c15bd --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_fstream/native_handle/wchar_t/1.cc @@ -0,0 +1,21 @@ +// { dg-options "-fno-inline" } +// { dg-do run { target c++26 } } +// { dg-additional-files "filebuf_members-1.txt" } + +#include +#include + +void +test01() +{ + static_assert( std::is_same_v ); + std::wfstream f; + f.open("filebuf_members-1.txt", std::wios::in); + VERIFY( f.native_handle() == f.rdbuf()->native_handle() ); +} + +int main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/27_io/basic_ifstream/native_handle/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_ifstream/native_handle/char/1.cc new file mode 100644 index 00000000000..9eb477bb571 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_ifstream/native_handle/char/1.cc @@ -0,0 +1,21 @@ +// { dg-options "-fno-inline" } +// { dg-do run { target c++26 } } +// { dg-additional-files "filebuf_members-1.txt" } + +#include +#include + +void +test01() +{ + static_assert( std::is_same_v ); + std::ifstream f; + f.open("filebuf_members-1.txt"); + VERIFY( f.native_handle() == f.rdbuf()->native_handle() ); +} + +int main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/27_io/basic_ifstream/native_handle/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_ifstream/native_handle/wchar_t/1.cc new file mode 100644 index 00000000000..a4680ae31eb --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_ifstream/native_handle/wchar_t/1.cc @@ -0,0 +1,21 @@ +// { dg-options "-fno-inline" } +// { dg-do run { target c++26 } } +// { dg-additional-files "filebuf_members-1.txt" } + +#include +#include + +void +test01() +{ + static_assert( std::is_same_v ); + std::wifstream f; + f.open("filebuf_members-1.txt"); + VERIFY( f.native_handle() == f.rdbuf()->native_handle() ); +} + +int main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/27_io/basic_ofstream/native_handle/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_ofstream/native_handle/char/1.cc new file mode 100644 index 00000000000..38aea6fa72d --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_ofstream/native_handle/char/1.cc @@ -0,0 +1,21 @@ +// { dg-options "-fno-inline" } +// { dg-do run { target c++26 } } +// { dg-additional-files "filebuf_members-1.txt" } + +#include +#include + +void +test01() +{ + static_assert( std::is_same_v ); + std::ofstream f; + f.open("filebuf_members-1.txt"); + VERIFY( f.native_handle() == f.rdbuf()->native_handle() ); +} + +int main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/27_io/basic_ofstream/native_handle/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_ofstream/native_handle/wchar_t/1.cc new file mode 100644 index 00000000000..dcc72e96164 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_ofstream/native_handle/wchar_t/1.cc @@ -0,0 +1,21 @@ +// { dg-options "-fno-inline" } +// { dg-do run { target c++26 } } +// { dg-additional-files "filebuf_members-1.txt" } + +#include +#include + +void +test01() +{ + static_assert( std::is_same_v ); + std::wofstream f; + f.open("filebuf_members-1.txt"); + VERIFY( f.native_handle() == f.rdbuf()->native_handle() ); +} + +int main() +{ + test01(); +} -- 2.41.0