Issue 129723
Summary Using std::hash through <typeindex> does not compile for builtin arithmetic types
Labels new issue
Assignees
Reporter johnfranklinrickard
    As far as I am aware (hope I am not mistaken), this should be valid C++ code.

```
#include <typeindex>
std::size_t test(int i) { return std::hash<int>()(i); }
```

>From the C++ draft http://wg21.link/N4950:
In `[unord.hash]` 2:

> Each header that declares the template hash provides enabled specializations of hash for nullptr_t and all
cv-unqualified arithmetic, enumeration, and pointer types

And in `[type.index.synopsis]` it is mentioned that the header `<typeindex>` also declares the template `std::hash`.

In my opinion the msvc STL has it correctly in this case and the code compiles correctly.
Both libc++ and libstdc++ currently do not work for this code snippet and reject it with `implicit instantiation of undefined template 'std::hash<int>'`.

[Godbolt link](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGIAKwAbKSuADJ4DJgAcj4ARpjEIGakAA6oCoRODB7evnppGY4C4ZExLPGJXLaY9kUMQgRMxAQ5Pn5B1bVZDU0EJdFxCUm2jc2teVUKo30RA%2BVDXACUtqhexMjsHOYAzBHI3lgA1CbbbgQAnimYEViqJ9gmGgCCU%2BggIBkAXpgA%2BgSHBEwUwgEX%2BeEWxwA7BZDsRMAQ1gxDq93ggmAoECc3KD7hBFiDFicYSZIQARDjLWicfy8PwcLSkVCcNzWazI1brTDHMzbHikAiaCnLADWSQAHAA6SEATkkgWl20kGjFGn82zF%2Bk4klpgsZnF4ChAGn5guWcFgMEQKFQLBSdAS5EoaFt9sSADdkCkUj83VxpT8DICpj9VIFpDRaIDiIaILFdbEIk1zpw%2BQnmMRzgB5WLaTAOFO8Z1sQSZhi0ZP03hYWJeYBuMS0Q3cKuYFiGYDiSukfBwhx4N1A3WYVR5ryAgvkQQ1XW0PCxYhJjxYXUEYh4FgTgfEWLpTCk1vt2dGU18AzABQANTwmAA7pmrnS%2BfxBCIxOwpDJBIoVOou7oqgYx6mJY1j6HOhqQMsqApHUTa8KgW5rlgEF4p0eZ1C4DDuJ4bRJMkYSzGUFQgBqBSZAI4x%2BGYyRkXU/REUMGp2Oh3TTJReFoX2Ag9M09GDIkTFsTheTUSMvR8fMAnLAoHIbBIlLUjqXZMhwhyhpIhwsAoHqHL60oSoGQL/BAuCECQ3K8osvACpWiwiiAkiQhKYpcGYkjqoEYqymY/gflSHDaqQG7%2BMadIMipBpGiatmkOaVqrAQKRjo6EDOna9DEFErCbKoYqBAAtGGhzAMgyCHBAq5eAwwpWSE%2BBEEhejPsIojiB%2BzXfmour/qQN4LikBYKRwNKkGF8GcJmY5Jf8qBUGpRVaTpekGUwQbGR4LoZRZSzWaaywIJgTBYIkqH%2BYFwWhbqEW2FFNlaHZpCijyErbNs0rSpCPLStRkgqlw/iahw2xKeF%2BrRfdsWWnFEBIGlropXDGUgOezApBiqAEHwdBRjGcZdmmSYTgTGbZrm%2BbNqQRaMAQpblrq1a1vWtCNhOWBtkYnYMj2LEDk2DLDqO44U6C05drO86LhgmwMqu66bgkO5KPu7MdhEoAxVQZ6Xted4PhOzWvm14ayJ1v4MroySAcYrKWGBsQoVBMFZHBjKIXgyHwNJNQsc4ECuOxVQEaU/H5Ok5HZMJfhVLRWQScRkze1x9RCbkUecXUPEzMHkl6FMvQB2JvGESHSwrGscml/5I1jXqqm5QVRUlWVFXEFVNXlaZDXbbVd1Co9EiSBKQSqvKXBipCKqSG5wRnbwF2jVdYOGsavdmlDSAJdNCM2ulCRZWwnD14VGlN%2BVlXVbVmD1SQ7tNbIhvvsbX5KF1f7DH1TADc2Q3V4vHCTYlMchxZpqTysfYqpUz6twvuVDau9iAWTMD3PapADpHSGKdLUc8AiXWUkvW6KCnpmAlNKLgGhSFcD9JCN6bkNT%2BWBgvPBHBdoxWhuva0m0HQUFSjvV0KArZ/GgcKLGkYEi43jImDMRNJFZhzOhCcVMSxlgrFzTANY6wNibHyNmh5pZVjwL2RwvMhwjmQGOTYfIRb%2BQZOLBcGYlx6P5GuDcFMtyKz3AeDmasTyayYOeK8t57yMH1vfVqj9PzyBfmbHQIBtj6HbCgG2NhxYO0ZE7AQTZ8qvHFicUkKSCDoGAlYSw8E3Ye0gunLImFsKpz0EHOY8dUhhzqAXGOxRi45wTl0biKdcJdJ9sncSHTGl5zGJHXO0w44LGkrJd8P8QbjTrmAoq%2Bx2xQLbhCEy18EE7B2uDPuopJD%2BAlGPMw0px6BDcpQsUNzAbnRwYw0GzCborxPNDDeU1krcMRnvbKh9lkaVWUYdZF9eBXzMo1KoBswkDwiabbqsTer9UGoDX%2BTCAHTWAXNI%2BKyrYgvbhAOBroLLbGQbZfah1jqUCGvckKjzFmRVeeS/ubkSH%2BEkFPbYGgNA8lVJCDQcT6ELNriw%2B6Q0zDCuuqvZYW4MjOEkEAA%3D%3D%3D)

I only checked it for `<typeindex>`, but this could affect more headers where `std::hash` is supposed to be defined as mentioned in [cppreference](https://en.cppreference.com/w/cpp/utility/hash).

Under the assumption that this is correct C++, would it be possible to fix these includes for the LLVM standard library?
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to