The result of converting a negative number string into an unsigned integer was specified to produce zero until C++17, although some implementations followed the protocol of std::strtoull which negates in the target type, giving LLONG_MAX for "-1", and so produce the largest value of the target type instead. As of C++17, strictly following std::strtoull is the correct behavior.
If the minus sign was part of the input sequence, the numeric value calculated from the sequence of digits is negated as if by unary minus in the result type, which applies unsigned integer wraparound rules.
Seems to be a bit murky. If I'm reading the cpp-reference right then Clang is doing what it was supposed to do pre-c++17 and not doing what it's supposed to do post c++17! But I haven't got a copy of Clang and I could well be misinterpreting cpp-reference.