[clean-list] Clean compiler bug

eli+@gs211.sp.cs.cmu.edu eli+@gs211.sp.cs.cmu.edu
Thu, 1 Feb 2001 15:18:19 -0500 (EST)


--%--multipart-mixed-boundary-1.16093.981058699--%
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

"Clean compiler exited abnormally" is all it tells me.  This is 1.3.1
under Linux (Redhat 5.2).  I've attached cleanbug2.icl and .dcl,
a condensed version of the code that triggers the bug.

The code compiles if the ev_pwclist function is removed.

If the .icl is changed from an "implementation module" to a standalone
"module", the problem goes away, and ev_pwclist works correctly.

Am I doing something illegal to trigger this bug?  Or, in any event,
is there a workaround?

-- 
     Eli Brandt  |  eli+@cs.cmu.edu  |  http://www.cs.cmu.edu/~eli/

--%--multipart-mixed-boundary-1.16093.981058699--%
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Description: C++ program text
Content-Disposition: attachment; filename="cleanbug2.icl"

// minimal edit of cleanbug1
implementation module cleanbug2
import StdEnv

:: Time :== Int
:: Event a = Event (!Time, !a)


        /*** event ***/

// e_shift dt e
// add to the time of an event
e_shift :: .Time !.(Event a) -> .Event a
e_shift dt (Event (t, v)) = Event (t + dt, v)

e_time :: !.(Event a) -> Time
e_time  (Event (t, _)) = t


        /*** vec ***/

// v_empty
v_empty :: u:(a v:b) | Array .a & ArrayElem b, [u <= v]
v_empty = {}

// v_isempty x
v_isempty :: u:(a v:b) -> Bool | Array .a & ArrayElem b, [u <= v]
v_isempty x = (v_length x) == 0

// v_length x
v_length :: u:(a v:b) -> Int | Array .a & ArrayElem b, [u <= v]
v_length x = size x


// v_fromscalar x0
v_fromscalar :: v:a -> u:(b v:a) | Array .b & ArrayElem a, [u <= v]
v_fromscalar x0 = {x0}

// v_fromlist lis
v_fromlist :: .[a] -> .(b a) | Array .b & ArrayElem a
v_fromlist lis = {xi \\ xi <- lis}


// v_const xi n
v_const :: a .Int -> .(b a) | Array .b & createArray_u a
v_const xi n = createArray n xi


// v_join x y
v_join :: .(a b) .(c b) -> .(d b)
       | Array .c & Array .a & ArrayElem b & Array .d
v_join x y
    = rewrite_y 0 (rewrite_x 0 blank)
    where blank = v_const (v_peek 0 x) joinlen
          joinlen = xlen + ylen
          xlen = v_length x
          ylen = v_length y
          rewrite_x i target
              | i >= xlen  = target
              = rewrite_x (i+1) (v_poke i (v_peek i x) target)
          rewrite_y i target
              | i >= ylen  = target
              = rewrite_y (i+1) (v_poke (xlen + i) (v_peek i y) target)


// v_peek i x
v_peek :: .Int u:(a v:b) -> v:b | select_u b & Array .a, [u <= v]
v_peek i x = x.[i]

// v_poke i xi x
v_poke :: .Int v:a *(b v:a) -> u:(b v:a) | Array .b & update_u a, [u <= v]
v_poke i xi x = update x i xi

// v_fill start upto xi x
v_fill :: .Int .Int a *(b a) -> .(b a) | Array .b & update_u a
v_fill start upto xi x
    = loop start x
    where loop i x
            | i >= upto  = x
            = loop (i+1) (v_poke i xi x)


        /*** event-vec ***/

// ev_fromlist pairlist
ev_fromlist :: [(.Time,a)] -> .(b (Event a)) | Array .b
ev_fromlist pairlist = v_fromlist (map Event pairlist)

// ev_close 
// close a breakpoint vector: {.., (t, x)} -> {.., (t, x), (t+1, x)}
ev_close :: u:(a v:(Event b)) -> .(c (Event b)) | Array .a & Array .c, [u<=v]
ev_close evs
    | v_isempty evs  = v_empty
    = v_join evs (v_fromscalar closing_ev)
    where closing_ev = e_shift 1 last_ev
          last_ev = v_peek ((v_length evs) - 1) evs

// ev_pwc x0 evs
// piecewise constant from breakpoint vector.
ev_pwc :: a u:(b v:(Event a)) -> .(c a)
       | ArrayElem a & Array .b & Array .c, [u <= v]
ev_pwc x0 evs
    = loop 0 x0 0 blank
    where blank = v_const x0 tmax
          evslen = v_length evs
          tmax = e_time (evs.[evslen-1])
          loop ievs xt0 t0 target
              | ievs >= evslen  = target
              = loop (ievs+1) xt1 t1 (v_fill t0 t1 xt0 target)
                where (Event (t1, xt1)) = v_peek ievs evs

//*** crashes the compiler
// ev_pwclist x0 pairlist
ev_pwclist :: a [(.Time,a)] -> .(b a) | Array .b & ArrayElem a
ev_pwclist x0 pairlist
    = ev_pwc x0 (ev_close (ev_fromlist pairlist))
//    = {x0}    // this works fine

/*
Start :: {#Int}
Start = ev_pwclist 0 [(3,17), (5, 42)]
*/

--%--multipart-mixed-boundary-1.16093.981058699--%
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Description: C++ program text
Content-Disposition: attachment; filename="cleanbug2.dcl"

// minimal edit of cleanbug1
definition module cleanbug2
import StdEnv


:: Time :== Int
:: Event a = Event (!Time, !a)


        /*** event ***/

// e_shift dt e
// add to the time of an event
e_shift :: .Time !.(Event a) -> .Event a

// e_time e
e_time :: !.(Event a) -> Time


        /*** vec ***/

// v_empty
v_empty :: u:(a v:b) | Array .a & ArrayElem b, [u <= v]

// v_isempty x
v_isempty :: u:(a v:b) -> Bool | Array .a & ArrayElem b, [u <= v]

// v_length x
v_length :: u:(a v:b) -> Int | Array .a & ArrayElem b, [u <= v]


// v_fromlist lis
v_fromlist :: .[a] -> .(b a) | Array .b & ArrayElem a

// v_fromscalar x0
v_fromscalar :: v:a -> u:(b v:a) | Array .b & ArrayElem a, [u <= v]


// v_const xi n
v_const :: a .Int -> .(b a) | Array .b & createArray_u a


// v_join x y
v_join :: .(a b) .(c b) -> .(d b)
       | Array .c & Array .a & ArrayElem b & Array .d


// v_peek i x
v_peek :: .Int u:(a v:b) -> v:b | select_u b & Array .a, [u <= v]

// v_poke i xi x
v_poke :: .Int v:a *(b v:a) -> u:(b v:a) | Array .b & update_u a, [u <= v]

// v_fill start upto xi x
v_fill :: .Int .Int a *(b a) -> .(b a) | Array .b & update_u a


        /*** event-vec ***/

// ev_fromlist pairlist
ev_fromlist :: [(.Time,a)] -> .(b (Event a)) | Array .b

// ev_close 
// close a breakpoint vector: [.., (t, x)] -> [.., (t, x), (t+1, x)]
ev_close :: u:(a v:(Event b)) -> .(c (Event b)) | Array .a & Array .c, [u<=v]

// ev_pwc x0 evs
// piecewise constant from breakpoint vector.
ev_pwc :: a u:(b v:(Event a)) -> .(c a)
       | ArrayElem a & Array .b & Array .c, [u <= v]

// ev_pwclist x0 pairlist
ev_pwclist :: a [(.Time,a)] -> .(b a) | Array .b & ArrayElem a

/*XXX
  XXX*/

--%--multipart-mixed-boundary-1.16093.981058699--%--