Optimizer broken for some cases of foreach.
Imported from http://bugzilla.roxen.com/bugzilla/show_bug.cgi?id=7216
Reported by @grubba
From LysLysKOM 20892964:
20892964 igår 19:14 /35 rader/ Per Hedbor () Mottagare: Henrik Grubbström (Lysator) <12718> Mottagare: Per Hedbor () <9371> Mottagare: Martin Nilsson (Opera Mini - AFK!) <15149> Ärende: foreach() optimering
Det finns en optimering av foreach som har ett aningens trasigt fall:
foreach( arr[START..], ... ):
Om start är icke-konstant och evaulerar till ett negativt tal får man ett fel.
Det hela förklarar (eller, ja....) den aningens udda kollen för om loop-variabeln är negativ i gamla 7.8 versioner.
Med nyare pikear så får man lite random-data som svalue istället:
# leopard$ pike ~/bug.pike
Failed to use <Unknown 16384>
/home/per/bug.pike:21: /main()->_bug(4)
/home/per/bug.pike:29: /main()->main()
# leopard$ pike7.8 ~/bug.pike
Foreach loop variable is negative!
/home/per/bug.pike:17: /main()->_bug(3)
/home/per/bug.pike:29: /main()->main()
Testfall:
array sorted_configs = ({});
string backups_dir = "/tmp";
void main()
{
foreach (column (sorted_configs, 0)[random(0) - 1..], string entry)
if( catch( combine_path (backups_dir, entry) ) )
error("Failed to use %O\n", entry );
}
(20892964) /Per Hedbor ()/--------------------------