- && sizeof(ebuf) - float_need > precis
+ && sizeof(ebuf) - float_need > precis + 7
Thanks for digging. :) I suspect that the compiler is (quite reasonably) failing to understand that we check the size of the radix point and adjust float_need accordingly - that it assumes worst case we will not enter that branch (of which it in any case cannot reasonably understand the intent), and so its analysis acts as if we're always treating the radix point as width 1.
It would probably be reasonable to make the above change (but probably folding it into float_need instead:
- + 1 /* default radix point '.' */
+ + 8 /* worst case radix point */
) and remove the later "float_need += (SvCUR(PL_numeric_radix_sv) - 1)". Though it's sad that this isn't enough to remove the need for the whole WITH_LC_NUMERIC_SET_TO_NEEDED_IN malarkey.
I'll respond to the github issue separately, it'll take me some time to go through the options you describe.