------- Additional Comments From ncm-nospam at cantrip dot org 2005-01-21 15:22 ------- This is a real bug, but easily fixed, and (I think) without breaking ABI.
The problem is in basic_string.h, where it says struct _Rep : _Rep_base { // Types: typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc; Technically this should be "rebind<_Rep>::other". Of course then it's not really a raw-bytes allocator, but we have no need for a raw_bytes allocator. We need an allocator of space for a _Rep with room for raw bytes at the end. Remaining to fix is to change the name in the very few places where it's used, and to change the argument to allocate() (and deallocate) so that it ends up allocating the right number of bytes. Probably a better fix would be to use "rebind<T>::other", where T is the most strictly-aligned of members of _Rep, i.e. size_type or _Atomic_word. This is easily determined as the union of the two: union { _Atomic_word w; size_type s; } _Alloc_unit; typedef typename _Alloc::template rebind<_Alloc_unit>::other _Raw_alloc; and then scale the argument to allocate() by the size of _Alloc_unit. Fortunately, the required "/ sizeof(_Alloc_unit)" may (will?) be weakened to ">> 2" or ">> 4" on all real targets. Either way, then, it's up to __gnu_cxx::array_allocator<char_type, array_type> to make sure its argument is aligned properly. If it can't, that's a (more serious) bug in that template. The test case 2.cc had better leave enough room in the byte array for that alignment adjustment, which it does not quite do, I think, on 64-bit targets. Of course all this means this bug is not really an "enhancement", but bugzilla won't let me fix that. -- What |Removed |Added ---------------------------------------------------------------------------- CC| |ncm-nospam at cantrip dot | |org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19495