[libc++ patch] Make locales (and transitively, std::endl) work reliably with gcc
Marshall Clow
mclow.lists at gmail.com
Tue Jun 3 20:19:09 PDT 2014
On Jun 3, 2014, at 2:28 PM, Nico Weber <thakis at chromium.org> wrote:
> Ping?
Is there some reason that you’re using __SIZEOF_SIZE_T__ instead of sizeof(size_t) ?
Other than that, LGTM.
— Marshall
>
>
> On Mon, Jun 2, 2014 at 10:11 AM, Nico Weber <thakis at chromium.org> wrote:
> Ping.
>
>
> On Fri, May 30, 2014 at 4:04 PM, Nico Weber <thakis at chromium.org> wrote:
> Hi,
>
> on trunk, libc++ relies on undefined initialization order of global initializers when using gcc:
>
> 1. __start_std_streams in iostream.cpp calls locale::id::_init, which assigns an id to each locale::facet in an initializer
>
> 2. Every facet has a static locale::id id, whose constructor sets the facet's id to 0*
>
> If 2 runs after 1, it clobbers the facet's assigned consecutive id, causing exceptions to be thrown when e.g. running code like "cout << endl".
>
> To fix this, the attached patch lets _LIBCPP_CONSTEXPR evaluate to "constexpr" instead of nothing with gcc. locale::id's constructor is marked _LIBCPP_CONSTEXPR, which ensures that it won't get an initializer that could potentially run after the iostream.cpp initializer. (This remains broken when building with msvc.)
>
> Once _LIBCPP_CONSTEXPR is available, bitset fails to compile since gcc doesn't define __SIZE_WIDTH__, so switch bitset to use __SIZEOF_SIZE_T__ which both clang and gcc define.
>
> Pair-programmed/debugged with Dana Jansens.
>
> Nico
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140603/a58270de/attachment.html>
More information about the cfe-commits
mailing list