On Thu, 5 Dec 2019 at 12:43, Jonathan Wakely <jwak...@redhat.com> wrote:
>
> On 05/12/19 09:00 +0100, Christophe Lyon wrote:
> >On Tue, 3 Dec 2019 at 10:16, Jonathan Wakely <jwak...@redhat.com> wrote:
> >>
> >> On 03/12/19 09:11 +0100, Christophe Lyon wrote:
> >> >On Mon, 16 Sep 2019 at 04:34, Tom Honermann <t...@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  <t...@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"


Christophe

Reply via email to