[wx-dev] (64 bit) hashmap/long long problem in HEAD and 2.7.2
Michael Wetherell
mike.wetherell at ntlworld.com
Wed Nov 1 06:21:02 PST 2006
On Wednesday 01 Nov 2006 14:07, Vadim Zeitlin wrote:
> On Wed, 1 Nov 2006 14:45:21 +0100 Jan van Dijk
> <jan at etpmod.phys.tue.nl> wrote:
>
> JvD> On my 64 bit Linux system (with gcc-4.1.0) hashmap.h generates
> (serious) JvD> compiler warnings when compiling wx-head:
> JvD>
> JvD> ../include/wx/hashmap.h: In member function ‘size_t
> JvD> wxIntegerHash::longlongHash(long long int) const’:
> JvD> ../include/wx/hashmap.h:471: warning: right shift count >= width
> of type JvD>
> JvD> From inspection of the code, this is caused by a deeper problem,
> the fact that JvD> wxLongLongIsLong is not defined, although on my
> system
> JvD> sizeof(long)==sizeof(long long)==8.
>
> I think it's correct that wxLongLongIsLong is not defined. This
> symbol is used, at least according to the comments before its
> definition, to avoid defining overloaded functions for long and
> wxLongLong_t parameters which doesn't work when wxLongLong_t is the
> same as long as it results in duplicate declaration. However if
> wxLongLong_t is "long long", then it's a separate type from long just
> as long is separate type from int even if both of them have the same
> size.
>
> JvD> The problem is probably the logic in include/wx/defs.h, around
> line 912 that JvD> reads:
> JvD>
> JvD> [...]
> JvD> /* first check for compilers which have the real long long */
> JvD> #if (defined(SIZEOF_LONG_LONG) && SIZEOF_LONG_LONG >= 8) || \
> JvD> [...]
> JvD>
> JvD> On my system this evaluates as true, while wxIsLongLong is
> defined only in the JvD> last #else block.
>
> So I do not think this is a problem.
Yes it is the problem, long is 64-bit on that OS.
The function longlongHash is an implementation helper for the
wxLongLong_t overloads of operator(), which should only be defined when
long is not long long.
> The problem is shift by sizeof(long) bytes in wx/hashmap.h, we
> really need to shift by sizeof(long long)/2 here. I am not sure
> what's the best way to fix it though -- sizeof(size_t) is 4 on 64 bit
> Unix machines usually,
No it's 8.
> but it is 8 under Windows. So I guess it's
> better to use wxUint32 explicitly here even though it's still wrong
> for sizeof(size_t) == 8.
No, it's only used when long is 4 bytes anyhow.
> Anyhow, please let me know if you still have any problems with the
> revision 1.61 of wx/hashmap.h.
Suggest you revert, why change it when it's been well tested by the
HashesTestCase though all of 2.6.x?
Regards,
Mike
More information about the wx-dev
mailing list