This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
Re: libstdc++ versus -Wcast-align
- From: Gerald Pfeifer <pfeifer at dbai dot tuwien dot ac dot at>
- To: Benjamin Kosnik <bkoz at redhat dot com>
- Cc: libstdc++ at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Date: Fri, 2 May 2003 20:48:29 +0200 (CEST)
- Subject: Re: libstdc++ versus -Wcast-align
- References: <Pine.BSF.4.53.0304280154120.94316@acrux.dbai.tuwien.ac.at><20030428084344.13f227d5.bkoz@redhat.com>
[ gcc -> gcc-patches ]
On Mon, 28 Apr 2003, Benjamin Kosnik wrote:
> You can try adding
>
> #pragma GCC system_header
>
> to bits/stl_alloc.h, which might hide this error.
Would you accept such a patch for mainline (and later the 3.3 branch)?
> You could try using a different allocator than the default __pool_alloc.
>
>> /sw/gcc-current/include/c++/3.4/bits/stl_alloc.h:516: warning: cast from `char*
>> ' to `std::__pool_alloc<true, 0>::_Obj*' increases required alignment of
>> target type
>
> The other option would be to properly align allocated memory.
I suppose that memory _is_ correctly aligned, else we'd get actual
run-time errors, not just warnings with -Wcast-align?
And if that is the case, isn't the problem that internally we use
char* in cases where we should use void*, at least when not doing
arithmetics?
> So
>
> 516:
> __next_obj = (_Obj*)((char*)__next_obj + __n);
>
> probably comes from:
>
> 456:
> _S_start_free = (char*) __new_alloc::allocate(__bytes_to_get);
>
> You'll need to figure out how to align this.
I'm afraid I'd need to enter areas of code quite unknown to me if I'm
going to try and fix this myself, but <some time later>:
The following hack really seems to work. and removes all warnings I got
for -Wcast-qual on sparc-sun-solaris2.9. If I brush this up with a proper
ChangeLog and full testruns, would something like this be acceptable?
Gerald
--- stl_alloc.h.orig Fri May 2 20:31:51 2003
+++ stl_alloc.h Fri May 2 20:33:54 2003
@@ -450,6 +450,6 @@ namespace std
_S_free_list + _S_freelist_index(__bytes_left);
- ((_Obj*)_S_start_free) -> _M_free_list_link = *__my_free_list;
- *__my_free_list = (_Obj*)_S_start_free;
+ ((_Obj*)(void*)_S_start_free) -> _M_free_list_link = *__my_free_list;
+ *__my_free_list = (_Obj*)(void*)_S_start_free;
}
_S_start_free = (char*) __new_alloc::allocate(__bytes_to_get);
@@ -509,10 +509,10 @@ namespace std
// Build free list in chunk.
- __result = (_Obj*)__chunk;
- *__my_free_list = __next_obj = (_Obj*)(__chunk + __n);
+ __result = (_Obj*)(void*)__chunk;
+ *__my_free_list = __next_obj = (_Obj*)(void*)(__chunk + __n);
for (__i = 1; ; __i++)
{
__current_obj = __next_obj;
- __next_obj = (_Obj*)((char*)__next_obj + __n);
+ __next_obj = (_Obj*)(void*)((char*)__next_obj + __n);
if (__nobjs - 1 == __i)
{