[PATCH 4/4]: C++ P1423R3 char8_t remediation: New tests
Jonathan Wakely
jwakely@redhat.com
Fri Dec 20 17:11:00 GMT 2019
On 19/12/19 09:36 +0000, Jonathan Wakely wrote:
>On 05/12/19 17:12 +0100, Christophe Lyon wrote:
>>On Thu, 5 Dec 2019 at 12:43, Jonathan Wakely <jwakely@redhat.com> wrote:
>>>
>>>On 05/12/19 09:00 +0100, Christophe Lyon wrote:
>>>>On Tue, 3 Dec 2019 at 10:16, Jonathan Wakely <jwakely@redhat.com> wrote:
>>>>>
>>>>> On 03/12/19 09:11 +0100, Christophe Lyon wrote:
>>>>> >On Mon, 16 Sep 2019 at 04:34, Tom Honermann <tom@honermann.net> wrote:
>>>>> >>
>>>>> >> A revised patch is attached that modifies the tests for deleted ostream
>>>>> >> inserters to require C++2a. This is required by the revision of patch
>>>>> >> 2/4 that adds proper preprocessor conditionals to the definitions.
>>>>> >>
>>>>> >> Tom.
>>>>> >>
>>>>> >> On 9/15/19 3:40 PM, Tom Honermann wrote:
>>>>> >> > This patch adds new tests to validate new deleted overloads of wchar_t,
>>>>> >> > char8_t, char16_t, and char32_t for ordinary and wide formatted
>>>>> >> > character and string ostream inserters.
>>>>> >> >
>>>>> >> > Additionally, new tests are added to validate invocations of u8path with
>>>>> >> > sequences of char8_t for both the C++17 and filesystem TS implementations.
>>>>> >> >
>>>>> >> > libstdc++-v3/ChangeLog:
>>>>> >> >
>>>>> >> > 2019-09-15 Tom Honermann <tom@honermann.net>
>>>>> >> >
>>>>> >> > *
>>>>> >> > libstdc++-v3/testsuite/27_io/basic_ostream/inserters_character/char/deleted.cc:
>>>>> >> >
>>>>> >> > New test to validate deleted overloads of character and string
>>>>> >> > inserters for narrow ostreams.
>>>>> >> > *
>>>>> >> > libstdc++-v3/testsuite/27_io/basic_ostream/inserters_character/wchar_t/deleted.cc:
>>>>> >> >
>>>>> >> > New test to validate deleted overloads of character and string
>>>>> >> > inserters for wide ostreams.
>>>>> >> > *
>>>>> >> > libstdc++-v3/testsuite/27_io/filesystem/path/factory/u8path-char8_t.cc:
>>>>> >> > New test to validate u8path invocations with sequences of
>>>>> >> > char8_t.
>>>>> >> > *
>>>>> >> > libstdc++-v3/testsuite/experimental/filesystem/path/factory/u8path-char8_t.cc
>>>>> >> >
>>>>> >> > New test to validate u8path invocations with sequences of
>>>>> >> > char8_t.
>>>>> >> >
>>>>> >
>>>>> >Hi,
>>>>> >
>>>>> >I've noticed that the new test
>>>>> >27_io/filesystem/path/factory/u8path-char8_t.cc
>>>>> >fails to compile on arm-none-eabi with default cpu/fpu, because:
>>>>> >/tools/arm-none-eabi/bin/ld:
>>>>> >/obj-arm-none-eabi/gcc3/arm-none-eabi/libstdc++-v3/src/.libs/libstdc++.a(string-inst.o):
>>>>> >in function `_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEOS4_':
>>>>> >string-inst.cc:(.text._ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEOS4_[_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEOS4_]+0xf4):
>>>>> >undefined reference to `_ZSt15__alloc_on_moveISaIcEEvRT_S2_'
>>>>> >[etc...]
>>>>>
>>>>> That function is defined inline and so should be instantiated in any
>>>>> TU that needs it, and so should not give linker errors. There was a
>>>>> similar bug reported the other day that turned out to be pilot error:
>>>>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92733
>>>>>
>>>>Hi,
>>>>Sorry for the delay, it took me a while to reproduce the problem manually.
>>>>I think I see this because I build that particular configuration with
>>>>CXXFLAGS_FOR_TARGET=-fno-threadsafe-statics
>>>>
>>>>Does that sound plausible?
>>>
>>>Not really ... I still don't know why that function template would
>>>ever be undefined.
>>>
>>
>>Hmmm that's because doing CXXFLAGS_FOR_TARGET means that the generated
>>Makefile contains:
>>CXXFLAGS = -fno-threadsafe-statics
>>while if I don't define CXXFLAGS_FOR_TARGET, it contains
>>CXXFLAGS = -g -O2 -D_GNU_SOURCE
>>
>>Re-compiling string-inst with -O2 removes the undefined reference
>>
>>Sigh... looks like I fixed something similar 7 years ago :-(
>>https://gcc.gnu.org/viewcvs/gcc?view=revision&revision=189046
>>
>>So... the current configure.ac code makes sure -O2 and -g are present
>>in CXXFLAGS_FOR_TARGET only if it's derived from CXXFLAGS, which
>>happens only when CXXFLAGS_FOR_TARGET is NOT overridden, and not
>>cross-compiling...
>>
>>We have:
>> case " $CXXFLAGS " in
>> *" -O2 "*) ;;
>> *) CXXFLAGS_FOR_TARGET="-O2 $CXXFLAGS_FOR_TARGET" ;;
>> esac
>>
>>Why isn't it case "$CXXFLAGS_FOR_TARGET" instead? And that whole
>>case/esac should be after the 'fi'.
>>Or is it that way on purpose?
>>
>>So it seems the fix for the problem I saw is for me to use
>>CXXFLAGS_FOR_TARGET="-O2 -g -fno-threadsafe-statics"
>
>This is https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92927 and thanks
>to the bisected revision number in the PR I see what the problem is.
To be clear, PR 92927 is about the undefined references when building
with -O0, and will be fixed soon by the attached patch that I've just
committed to trunk.
I don't know the answer to the question about CXXFLAGS_FOR_TARGET, and
don't know if it's that way on purpose. Please feel free to create a
bug for it, or propose a patch.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.txt
Type: text/x-patch
Size: 1773 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20191220/1d592ab3/attachment.bin>
More information about the Libstdc++
mailing list