[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--%--