https://timsong-cpp.github.io/cppwp/n4140/facet.num.get.virtuals#3.2
"Stage 2" of num_get::do_get() depends on "a check ... to determine if c is
allowed as the next character of an input field of the conversion specifier
returned by Stage 1". Previously this was a very simple check whether the next
character was in a set of allowed characters. This could lead to Stage 2
accumulating character sequences such as "1.2f" and passing them to strtold
(Stage 3).
https://timsong-cpp.github.io/cppwp/n4140/facet.num.get.virtuals#3.3.3
Stage 3 can fail, however, if the entire character sequence from Stage 2 is not
used in the conversion. For example, the "f" in "1.2f" is not used.
https://timsong-cpp.github.io/cppwp/n4140/facet.num.get.virtuals#3.3.4
As a result, parsing a sequence like "1.2f" would return value 0.0 with failbit
set.
This change improves the checks made in Stage 2, determining what is passed to
Stage 3.
- Hex digits are only considered valid if "0x" has been seen
- INFINITY value is recognised
- Characters in INFINITY and NAN are only valid in sequence. This is done by checking one character backwards, which has obvious limitations.
- New tests are added. The old ones are preserved but refactored.
I think it would be better to keep 4-space indentation for consistency with the rest of the file. See https://github.com/llvm/llvm-project/commit/7004d6664efde9d1148ed677649593f989cc6056