From: Jonathan Wakely <jwakely@redhat.com>
To: Rainer Orth <ro@cebitec.uni-bielefeld.de>
Cc: Ville Voutilainen <ville.voutilainen@gmail.com>,
libstdc++ <libstdc++@gcc.gnu.org>,
"gcc-patches@gcc.gnu.org" <gcc-patches@gcc.gnu.org>
Subject: Re: [v3 PATCH] Implement LWG 2221, No formatted output operator for nullptr
Date: Fri, 11 Jan 2019 00:01:00 -0000 [thread overview]
Message-ID: <20190111000146.GE15627@redhat.com> (raw)
In-Reply-To: <yddd0p4ursd.fsf@CeBiTec.Uni-Bielefeld.DE>
[-- Attachment #1: Type: text/plain, Size: 3305 bytes --]
On 10/01/19 22:27 +0100, Rainer Orth wrote:
>Hi Jonathan,
>
>> On 04/12/17 23:04 +0000, Jonathan Wakely wrote:
>>>On 03/12/17 23:08 +0200, Ville Voutilainen wrote:
>>>>Tested on Linux-x64.
>>>>
>>>>2017-11-14 Ville Voutilainen <ville.voutilainen@gmail.com>
>>>>
>>>> Implement LWG 2221
>>>> * include/std/ostream (operator<<(nullptr_t)): New.
>>>> * testsuite/27_io/basic_ostream/inserters_other/char/lwg2221.cc: New.
>>>
>>>>diff --git a/libstdc++-v3/include/std/ostream
>>>> b/libstdc++-v3/include/std/ostream
>>>>index f7cab03..18011bc 100644
>>>>--- a/libstdc++-v3/include/std/ostream
>>>>+++ b/libstdc++-v3/include/std/ostream
>>>>@@ -245,6 +245,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>>> operator<<(const void* __p)
>>>> { return _M_insert(__p); }
>>>>
>>>>+#if __cplusplus > 201402L
>>>>+ __ostream_type&
>>>>+ operator<<(nullptr_t)
>>>>+ { return *this << "nullptr"; }
>>>>+#endif
>>>
>>>As discussed on IRC, this requires a new symbol to be exported for the
>>>std::ostream and std::wostream explicit instantiations, or the new
>>>test will fail to link at -O0.
>>>
>>>That should wait for stage 1.
>>>
>>
>> This patch for a C++17 feature (posted over a year ago) should have
>> gone in during stage 1. I've taken care of the symbol exports that
>> were missing from the original patch.
>>
>> Tested x86_64-linux, committed to trunk.
>
>this patch broke Solaris bootstrap:
>
>ld: fatal: libstdc++-symbols.ver-sun: 7117: symbol 'std::basic_ostream<char, std::char_traits<char> >::operator<<(decltype(nullptr))': symbol version conflict
>ld: fatal: libstdc++-symbols.ver-sun: 7119: symbol 'std::basic_ostream<wchar_t, std::char_traits<wchar_t> >::operator<<(decltype(nullptr))': symbol version conflict
>
>ld: fatal: libstdc++-symbols.ver-sun: 7117: symbol '_ZNSolsEDn': symbol version conflict
>ld: fatal: libstdc++-symbols.ver-sun: 7119: symbol '_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEDn': symbol version conflict
>
>Again, there were two matches for those two symbols:
>
> GLIBCXX_3.4
> ##_ZNSolsE*[^Dg] (glob)
> _ZNSolsEDn;
> GLIBCXX_3.4.26
> ##_ZNSolsEDn (glob)
> _ZNSolsEDn;
>
> GLIBCXX_3.4
> ##_ZNSt13basic_ostreamIwSt11char_traitsIwEElsE*[^Dg] (glob)
> _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEDn;
> GLIBCXX_3.4.26
> ##_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEDn (glob)
> _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEDn;
>
>ISTM that the patterns were backwards. The following patch fixes this
>and allowed i386-pc-solaris2.11 bootstrap to complete without
>regressions relative to the last successful one.
I think what I should have done is change [^g] to [^gn]. That
preserves the original behaviour (don't match the ppc64 long double
symbols) but also excludes the new symbols, which end in 'n'.
Maybe the attached patch would be better though. It matches every
basic_ostream::operator<<(T) for any scalar T except 'g', and adds a
second pattern to match basic_ostream::operator<<(T*) for various T.
But neither of those matches the new operator<<(nullptr_t) overload.
FWIW I did run my symbol checker script, but it gets lots of false
positives because it doesn't understand the #if preprocessor
conditions, so it sees lots of false positive duplicates. I need to
make it smarter for it to be useful here.
[-- Attachment #2: patch.txt --]
[-- Type: text/x-patch, Size: 953 bytes --]
diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver
index 788c2e0303c..d3431d2c78e 100644
--- a/libstdc++-v3/config/abi/pre/gnu.ver
+++ b/libstdc++-v3/config/abi/pre/gnu.ver
@@ -495,7 +495,8 @@ GLIBCXX_3.4 {
_ZNSo8_M_writeEPKc[ilx];
_ZNSo3put*;
_ZNSo[5-9][a-z]*;
- _ZNSolsE*[^Dg];
+ _ZNSolsE[^g];
+ _ZNSolsEP*;
# std::basic_ostream<wchar_t>
_ZNSt13basic_ostreamIwSt11char_traitsIwEEC[12]Ev;
@@ -509,7 +510,8 @@ GLIBCXX_3.4 {
_ZNSt13basic_ostreamIwSt11char_traitsIwEE5writeEPKw*;
_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentry*;
_ZNSt13basic_ostreamIwSt11char_traitsIwEE8_M_writeEPKw[ilx];
- _ZNSt13basic_ostreamIwSt11char_traitsIwEElsE*[^Dg];
+ _ZNSt13basic_ostreamIwSt11char_traitsIwEElsE[^g];
+ _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEP*;
# std::ostream operators and inserters
_ZSt4end[ls]I[cw]St11char_traitsI[cw]EERSt13basic_ostream*;
next prev parent reply other threads:[~2019-01-11 0:01 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-03 21:08 Ville Voutilainen
2017-12-04 23:04 ` Jonathan Wakely
2019-01-10 13:15 ` Jonathan Wakely
2019-01-10 21:27 ` Rainer Orth
2019-01-11 0:01 ` Jonathan Wakely [this message]
2019-01-11 9:07 ` Rainer Orth
2019-01-11 11:01 ` Jonathan Wakely
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190111000146.GE15627@redhat.com \
--to=jwakely@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=libstdc++@gcc.gnu.org \
--cc=ro@cebitec.uni-bielefeld.de \
--cc=ville.voutilainen@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).