This is an archive of the discontinued LLVM Phabricator instance.

[libc++] Do not derive __gnu_cxx::hash<T> from std::hash<T>.
ClosedPublic

Authored by pcc on Feb 11 2014, 3:35 PM.

Details

Summary

Instead, define explicit specializations for the basic types listed in
the SGI documentation. This solves two problems:

  1. Helps avoid silent ODR violations caused by the absence of a user-supplied __gnu_cxx::hash specialization in cases where a std::hash specialization exists (e.g. for std::string).
  2. gnu_cxx::hash semantics are slightly different to those of std::hash (for example, the former may dereference a pointer argument) so it is inappropriate for gnu_cxx::hash to receive std::hash specializations by default.

Diff Detail

Event Timeline

pcc updated this revision to Unknown Object (????).Feb 27 2014, 2:09 PM

Add tests.

Other than the one test that I commented on, this looks ok to me.

test/extensions/hash/specializations.fail.cpp
16 ↗(On Diff #7410)

Now about
assert(__gnu_cxx::hash<std::string>()(std::string()) == 0); // error

instead?
That way you can't get caught up with implicit conversions.
[ I don't think it will matter, but I've been caught out before by failing tests failing, but for the wrong reason. ]

pcc added a comment.Mar 5 2014, 8:16 PM

Thanks, committing.

test/extensions/hash/specializations.fail.cpp
16 ↗(On Diff #7410)

Done.

pcc closed this revision.Mar 5 2014, 8:18 PM

Closed by commit rL203070 (authored by @pcc).