[libc++ patch] Make locales (and transitively, std::endl) work reliably with gcc

Nico Weber thakis at chromium.org
Mon Jun 2 01:11:01 PDT 2014


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/20140602/64463a1e/attachment.html>

More information about the cfe-commits mailing list