[MLton-user] compiler crash

andrew cooke andrew@acooke.org
Fri, 16 Apr 2004 17:29:45 -0400 (CLT)


thanks.  that helped me nail it.  great!  (i'd pulled a curried function
out of the scope within which its type could be inferred (i guess) and had
to add the missing arguments back in...)

cheers, andrew

Stephen Weeks said:
>
> Hi Andrew.  Thanks for the bug report.
>
>> just got an error message that's 37000 lines long and appears to show
>> some
>> kind of intermediate code representation, followed by an "unhandled
>> exception: TypeError" message.
>
> The problem you see is due to a known bug in MLton's front end that
> causes it to accept some programs that should be rejected.  Your guess
> as to the error message is correct -- the bug then leads to some type
> incorrect code that is caught by a type checker on one of our internal
> ILs.  I recently checked into our CVS a fix for this bug.  Feeding
> your program to a recently built version of MLton gives the following
> error message.
>
> Error: Lexer.sml 2.20: variable type in structure disagrees with signature
>    variable: lexer
>    unable to generalize: 'a
>    signature: ({char: int,
> 		line: int,
> 		r: 'a -> (char * 'a) option,
> 		s: 'a,
> 		src: string}
> 	       -> (token
> 		   * {char: int,
> 		      line: int,
> 		      r: 'a -> (char * 'a) option,
> 		      s: 'a,
> 		      src: string}) option)
> 	      -> ({char: int,
> 		   line: int,
> 		   r: 'a -> (char * 'a) option,
> 		   s: 'a,
> 		   src: string}
> 		  -> ((tag * token)
> 		      * {char: int,
> 			 line: int,
> 			 r: 'a -> (char * 'a) option,
> 			 s: 'a,
> 			 src: string}) option)
>
> Here is a simple example of a program (which should be rejected) that
> tickles this bug.
>
> ------------------------------------------------------------
> structure S:
>    sig
>       val r: 'a option ref
>    end =
>    struct
>       val r = ref NONE
>    end
> val _ = S.r := SOME 13
> val _ =
>    case !S.r of
>       NONE => ()
>     | SOME f => f ()
> ------------------------------------------------------------
>
>>From this, you can see that the bug is that MLton incorrectly
> polymorphically generalizes a variable defined in a structure when
> that variable has an unknown monotype (typically due to the value
> restriction).
>
> As to your code, the new MLton's error message indicates that
> Lexer.lexer does not have as general a type as you think.  This is
> likely due to the value restriction making something ungeneralizable.
> Adding some type annotations to Lexer.lexer and the functions it calls
> should help you track it down.
>
> Because of the nature of the bug, hopefully you can continue with
> MLton 20040227 using a few more annotations in your program.
> Alternatively, if you want to get the bug fix (and be bleeding edge in
> other ways), you could build MLton from the CVS.  If it is difficult
> for you to build MLton from CVS, let me know and I will put up an
> experimental release that contains this bug fix.
>
>


-- 
` __ _ __ ___  ___| |_____   work web site: http://www.ctio.noao.edu/~andrew
 / _` / _/ _ \/ _ \ / / -_)  personal web site: http://www.acooke.org/andrew
 \__,_\__\___/\___/_\_\___|  personal gallery: http://www.acooke.org/pancito