% set x [expr {1<<(2**29)}]; concat
% set x [expr {$x<<(2**29)}]; concat
% set x [expr {$x<<(2**29)}]; concat
% set x [expr {$x<<(2**29)}]; concat
% incr x -1; concat
% set s [format %#llx $x]; concat
Tcl_SetObjLength: negative length requested: -536870912 (integer overflow?)
Computing the value of numDigits overflows
the int range.
After applying attached patch:
% set max [expr {(1<<(2**31-3)<<(2**31-3)<<(2**31-3)<<(2**31-3))-1}]; concat
% set s [format %#llx $max]; concat
% string length $s
2147483647
% incr max; concat
% set s [format %#llx $max]; concat
max size for a Tcl value (2147483647 bytes) exceeded
This demos ability of [format] to create a numeric
string up to Tcl's limits.
A panic when those limits are exceeded is a bit
jarring, but that's a separate bug/misfeature.
Updated patch also converts all
[format] panics due to string length
overflow into simple Tcl errors.
patch committed for 8.5.8 and 8.6b2.