From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id 693D63861875; Fri, 15 Dec 2023 13:22:01 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 693D63861875 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1702646521; bh=nVs32AFIjdPZ435LCKgRhDiBdzgz8EFR1gX/BfvYuBw=; h=From:To:Subject:Date:From; b=JQSEsQnam6CF5pmexJ9Bj86hpRHl4gPrCdgF4zyTpnSBzWo0EUmOP7XkrzwU/qaw8 uSmBPM3NWxj4NKpFk0okpIRx9143pqwD8O2/whaow1gfYLHmX8KkzJgh4GPgRMgOIW CcLTVmz1fHRAMhZUGFwFfHrviz+hf4xSsH5ZwvQU= MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="utf-8" From: Jonathan Wakely To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r14-6592] libstdc++: Fix std::print test case for Windows X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/master X-Git-Oldrev: 7d2e100058790e3407ae02b6db4a276957deaa4f X-Git-Newrev: 1d8ac2a74fe37bb3d2fef63ed1ce19bc6f983189 Message-Id: <20231215132201.693D63861875@sourceware.org> Date: Fri, 15 Dec 2023 13:22:01 +0000 (GMT) List-Id: https://gcc.gnu.org/g:1d8ac2a74fe37bb3d2fef63ed1ce19bc6f983189 commit r14-6592-g1d8ac2a74fe37bb3d2fef63ed1ce19bc6f983189 Author: Jonathan Wakely Date: Fri Dec 15 12:58:37 2023 +0000 libstdc++: Fix std::print test case for Windows libstdc++-v3/ChangeLog: * src/c++23/print.cc (__write_to_terminal) [_WIN32]: If handle does not refer to the console then just write to it using normal file I/O. * testsuite/27_io/print/2.cc (as_printed_to_terminal): Print error message on failure. (test_utf16_transcoding): Adjust for as_printed_to_terminal modifying its argument. Diff: --- libstdc++-v3/src/c++23/print.cc | 13 ++++++++++++- libstdc++-v3/testsuite/27_io/print/2.cc | 7 ++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/src/c++23/print.cc b/libstdc++-v3/src/c++23/print.cc index 2fe7a2e3565..d72ab856017 100644 --- a/libstdc++-v3/src/c++23/print.cc +++ b/libstdc++-v3/src/c++23/print.cc @@ -35,7 +35,8 @@ #ifdef _WIN32 # include // _fileno -# include // _get_osfhandle +# include // _get_osfhandle, _open_osfhandle, _write +# include // _O_APPEND # include // GetLastError, WriteConsoleW #elifdef _GLIBCXX_HAVE_UNISTD_H # include // fileno @@ -324,6 +325,16 @@ namespace if (!to_valid_utf16(str, wstr)) ec = std::make_error_code(errc::illegal_byte_sequence); + // This allows us to test this function with a normal file, + // see testsuite/27_io/print/2.cc + if (!check_for_console(term)) + { + int fd = _open_osfhandle((intptr_t)term, _O_APPEND); + if (_write(fd, wstr.data(), wstr.size() * 2) == -1) + ec = {errno, generic_category()}; + return ec; + } + unsigned long nchars = 0; WriteConsoleW(term, wstr.data(), wstr.size(), &nchars, nullptr); if (nchars != wstr.size()) diff --git a/libstdc++-v3/testsuite/27_io/print/2.cc b/libstdc++-v3/testsuite/27_io/print/2.cc index e101201f109..8aa7888e7bd 100644 --- a/libstdc++-v3/testsuite/27_io/print/2.cc +++ b/libstdc++-v3/testsuite/27_io/print/2.cc @@ -39,7 +39,11 @@ as_printed_to_terminal(std::string& s) #else const auto ec = std::__write_to_terminal(strm, s); #endif - VERIFY( !ec || ec == std::make_error_code(std::errc::illegal_byte_sequence) ); + if (ec && ec != std::make_error_code(std::errc::illegal_byte_sequence)) + { + std::println("Failed to : {}", ec.message()); + VERIFY(!ec); + } std::fclose(strm); std::ifstream in(f.path); s.assign(std::istreambuf_iterator(in), {}); @@ -114,6 +118,7 @@ test_utf16_transcoding() VERIFY( as_printed_to_terminal(s) ); VERIFY( utf16_from_bytes(s) == s2 ); + s = (const char*)u8"£🇬🇧 €🇪🇺"; s += " \xa3 10.99 \xee\xdd"; VERIFY( ! as_printed_to_terminal(s) ); std::u16string repl = u"\uFFFD";