1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
  
     | 
    
      structure Bug =
struct 
  structure F = MLton.Finalizable
  fun new_t () =
      let 
        val p = 0
        val t = F.new p
        fun finalize x = ()
      in
        F.addFinalizer(t,finalize);
        t
      end
  fun from_string (_:string) = 
      let
        val x = new_t ()
      in
        F.withValue(x,fn p => ());
        x
      end
  val zero = from_string "0.0"
  (* NOTE: I removed the F.withValue lines in an attempt to make the
   code simpler, but the bug didn't manifest itself.  So I think these
   lines are critical. *)
  fun plus (x,y) = 
      let
        val z = new_t ()
      in
        F.withValue(x,fn xp => 
          F.withValue(y,fn yp => 
            F.withValue(z,fn zp => 
              let in
                z
              end)))
      end
end
 
structure B = Bug
fun bigsum (n,store) =
    if n = 0 then store else
    let
      val _ = if Int.mod(n,10000) = 0 then print (Int.toString n ^ "\n") else ()
    in
      bigsum(Int.-(n,1),B.plus(store,B.from_string(Int.toString n ^ ".0")))
    end
val bigsum = (fn n => bigsum(n,B.zero))
val x = bigsum 5000000
 
     |