[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