Annotation of researchv10no/cmd/sml/doc/bugs, revision 1.1

1.1     ! root        1: Known bugs, SML of NJ Version 0.43, 30 November 1989
        !             2: 
        !             3: Key: L = local             Priority Key:  A = should be done by release 1.0
        !             4:      E = Edinburgh                        P = will be fixed when parser redone
        !             5:      SB = Stony Brook                     B = should be done after 1.0
        !             6:      P = U Penn                                   C = not a bug
        !             7: 
        !             8: --------------------------------------------------------------------------------
        !             9: 2. (L.3):  Mispelled nonnullary constructors in patterns [parser]
        !            10: Problem: 
        !            11:   Mispelling a constructor with arguments in a pattern leads to misleading
        !            12:   error messages.
        !            13: Version: 0.18
        !            14: Code:  (in typing/typecheck.sml)
        !            15:       ...
        !            16:               app genType rvbs
        !            17:           end
        !            18:        | EXCEPTIONdec(ebs) =>
        !            19:           let fun checkWeak(VARty(ref(UNBOUND id))) =
        !            20:                                       ^ -- should have been UBOUND
        !            21:                     if tyvarWeakness id > abs
        !            22:                     then condemn "type variable in exception type too strong"
        !            23:       ...
        !            24: Comment:
        !            25:   probably requires rewrite of pattern parsing [dbm]
        !            26: Priority: P
        !            27: --------------------------------------------------------------------------------
        !            28: 4. (L.5):  duplicate specifications not checked
        !            29: Problem:
        !            30:   No checking for duplicated specifications in signatures.
        !            31: Version: 0.18
        !            32: Comment:
        !            33:   This should be done when building the signature symbol table.
        !            34: Priority: A
        !            35: --------------------------------------------------------------------------------
        !            36: 7. (L.8):  constructor representation
        !            37: Problem:
        !            38:   There is a bug involving constructor representation.  The compiler
        !            39:   examines the structure of a datatype and tries to determine an efficient
        !            40:   runtime representation for it.  For example, for the list datatype, nil
        !            41:   can be represented as an integer, and :: can just be a pointer to its
        !            42:   tuple argument (integers and tuples are distinct).  This fails in our system
        !            43:   at the structure level.  For example:
        !            44: Version: 0.18
        !            45: Code:
        !            46:     signature S = sig
        !            47:        type 'a t
        !            48:        datatype 'a list = nil | :: of 'a t
        !            49:     end
        !            50:     structure A : S = struct
        !            51:        datatype 'a list = nil | :: of 'a t
        !            52:        withtype 'a t = 'a * 'a list
        !            53:     end
        !            54: Comment:
        !            55:   Here the compiler can deduce the efficient representation for the
        !            56:   (local) list datatype in structure A; but this cannot be deduced in
        !            57:   the signature S (an object of type 'a t might not be a pointer).
        !            58: Priority: A
        !            59: --------------------------------------------------------------------------------
        !            60: 8. (L.9):  interactive error recovery
        !            61: Problem:
        !            62:   In the interactive mode, parser error recovery should be suppressed
        !            63:   (but isn't); the parser may continue to look for input after an error,
        !            64:   when the user would expect to be back at top level.
        !            65: Version: 0.18
        !            66: Priority: P
        !            67: --------------------------------------------------------------------------------
        !            68: 10. (L.11):  exhaustiveness messages at top-level
        !            69: Problem: Top level bindings should not report on exhaustiveness, but they do.
        !            70: Version: 0.18
        !            71: Priority: C
        !            72: --------------------------------------------------------------------------------
        !            73: 11. (L.12):  poor error messages [parser]
        !            74: Problem: Poor error message (parens are needed around the hd::tl pattern):
        !            75: Version: 0.18
        !            76: Code:
        !            77:    -  fun f hd::tl = 4;
        !            78: Messages:
        !            79:     Error: expected EQUAL, found ID (::)
        !            80:     Error: expected nonfix-identifier, found ID ::
        !            81:     Error: unbound variable bogus
        !            82:     Error: type error: operator and operand don't agree
        !            83:     operator : ((wrong*wrong list) -> wrong list)
        !            84:     operand : (wrong*('aA list -> 'aA list))
        !            85:     expression:
        !            86:       bogus :: tl
        !            87:     - 
        !            88: Comment:
        !            89:     The "unbound variable bogus" in particular is confusing.
        !            90: Priority: P
        !            91: --------------------------------------------------------------------------------
        !            92: 12. (L.14):  loss of information in value printing
        !            93: Problem:
        !            94:   When printing values formed using constructors created by functor application,
        !            95:   the argument type of the constructor can sometimes be lost, resulting in
        !            96:   inability to print the value accurately.
        !            97: Version: 0.18
        !            98: Code:
        !            99:        - functor F(type t) =
        !           100:        = struct
        !           101:        =   datatype r = C of t end
        !           102:        = end;
        !           103: 
        !           104:        - structure S = F(type t = int);
        !           105: 
        !           106:        - S.C 3;
        !           107:   [1]   val it = C - : S.r
        !           108: 
        !           109:   But
        !           110:        - signature SS = sig type t datatype r = C of t end;
        !           111: 
        !           112:         - structure S = struct type t = int  datatype r = C of t end;
        !           113: 
        !           114:        - S.C;
        !           115:        val it = fn : ?.t -> S.r
        !           116: 
        !           117:        - S.C 3;
        !           118:        val it = C 3 : S.r
        !           119: 
        !           120:   and
        !           121:        - structure S': SS = struct type t = int  datatype r = C of t end;
        !           122:        - S'.C;
        !           123:        val it = fn : ?.t -> S'.r
        !           124:        - S'.C 3;
        !           125:        val it = C 3 : S'.r
        !           126: 
        !           127: Comments:
        !           128:   It does not seem possible to recover the context from the structure S, because
        !           129:   there is no simple way to get back from the type S.r or the DATACON C to the 
        !           130:   structure environment.  This may be a reason for having type constructors
        !           131:   contain a pointer to their home structure rather than just the symbolic
        !           132:   path.  Another alternative would be to follow the path in S.r to find the
        !           133:   structure S so that we can use it as context for the type of C.
        !           134: Priority: B
        !           135: --------------------------------------------------------------------------------
        !           136: 13. (L.15):  printing of types from abstraction structure
        !           137: Problem:
        !           138:   Printing of types from an abstraction is not quite right.
        !           139: Code: (test/sigs/test7)
        !           140:     signature FOO = 
        !           141:     sig
        !           142:        type T1 and T2
        !           143:        val x1: T1 and x2: T2
        !           144:        sharing type T1 = T2
        !           145:     end
        !           146: 
        !           147:     abstraction Foo: FOO =
        !           148:     struct
        !           149:        datatype T1 = CON
        !           150:        type T2 = T1
        !           151:        val x1 = CON and x2 = CON
        !           152:     end
        !           153: 
        !           154:     [Foo.x1,Foo.x2];
        !           155: Messages:
        !           156:     [-,-] : ?.T1   (* should be Foo.T1 *)
        !           157: Priority: B
        !           158: --------------------------------------------------------------------------------
        !           159: 15. (E.12):  Error message
        !           160: Problem: Unfortunate error message (I left out `type'):
        !           161: Version: ?
        !           162: Code: 
        !           163:        - signature STWO = sig structure X:SIG and Y:SIG sharing X.t=Y.t end;
        !           164: Messages:
        !           165:        Error: bad path in sharing specification
        !           166: Comments:
        !           167: Priority: A
        !           168: --------------------------------------------------------------------------------
        !           169: 17. (E.25):  Inaccurate line numbers
        !           170: Problem:
        !           171:        Misleading line numbers for some things (eg. type errors in multi-line
        !           172:        datatype declarations). Could the system print something like
        !           173:        "Line 33ff", or a line range a la LaTeX, for these?
        !           174: Version:
        !           175: Code:
        !           176: Messages:
        !           177: Comments:
        !           178: Priority: P
        !           179: --------------------------------------------------------------------------------
        !           180: 20. (E.47):  "print" is overloaded rather than polymorphic
        !           181: Problem: print should be implemented as a pseudo-polymorphic function like =
        !           182: Version: 0.19
        !           183: Code:
        !           184:        - datatype Foo = FOO1 | FOO2;
        !           185:        - print FOO1;
        !           186: Messages:
        !           187:        Error: type error: no match for overloaded variable:
        !           188:        print
        !           189: Comments:
        !           190:        according to the original SML report, both "print" and "makestring"
        !           191:        should be polymorphic identity functions. In our [Edinburgh]
        !           192:        compiler, "print" is correctly polymorphic. "makestring" is
        !           193:        (incorrectly) overloaded, disallowing "makestring FOO1". Needless
        !           194:        to say, I want to be able to do "makestring" on datatypes.
        !           195: Priority: C
        !           196: --------------------------------------------------------------------------------
        !           197: 21. (E.48):  Bad error recovery in the typechecker:
        !           198: Problem:
        !           199: Version: 0.15a
        !           200: Code:
        !           201:        - signature SIG = sig
        !           202:             exception Foo of int
        !           203:             val A: int
        !           204:             val B: int
        !           205:             val C: int
        !           206:          end;
        !           207: 
        !           208:        - structure S: SIG =
        !           209:             struct
        !           210:                exception Foo: int
        !           211:                             ^
        !           212:                val A = 1
        !           213:                val B = 2
        !           214:                val C = 3
        !           215:             end
        !           216: Messages:
        !           217:        Error: Type in structure doesn't match signature
        !           218:        name = Foo
        !           219:        spec = (int -> exn)
        !           220:        actual = exn
        !           221:        Error: unmatched val spec: A
        !           222:        Error: unmatched val spec: B
        !           223:        Error: unmatched val spec: C
        !           224:        ^ there can be a lot of these!
        !           225: Comments:
        !           226:        Sometimes the exception error doesn't appear, just giving the unmatched
        !           227:        spec errors, rather misleadingly.
        !           228: Priority: A
        !           229: --------------------------------------------------------------------------------
        !           230: 24. (E.56): incomplete write
        !           231: Problem: [nick]
        !           232:     I'm trying to put in some bullet-proof error recovery into my
        !           233:     subprocess software, so that "^C" at ML top-level doesn't
        !           234:     confuse the daemon. What happens if an "output" operation is
        !           235:     active when ^C is hit - does it do a partial write? I seem to be
        !           236:     getting some buffer corruption somewhere, as a partial write is
        !           237:     immediately followed by another complete write. It might make
        !           238:     my life easier if "output" could be guaranteed atomic under "^C"
        !           239:     (i.e. any single output operation will complete before Interrupt
        !           240:     gets raised).
        !           241:        Just a thought. I'll perhaps put timers into the daemon and ML code
        !           242:     so that they flush and restart properly - this may solve the problem.
        !           243: Version:  ?
        !           244: Comments:
        !           245:    [Andrew] there should be a way to enable and disable interrupt.
        !           246: Priority: B
        !           247: --------------------------------------------------------------------------------
        !           248: 26. (E.58):  export ML within a use
        !           249: Problem:
        !           250:        Awkward behaviour when exportML is called while a file is being
        !           251:        "use"'d - the saved state raises Io_failure. Shouldn't
        !           252:        restarting clear the use stack?
        !           253: Version:
        !           254: Code:
        !           255: Messages:
        !           256: Comments:
        !           257: Priority: C
        !           258: --------------------------------------------------------------------------------
        !           259: 29. (E.62):  use_string in structure definition
        !           260: Submitter: Nick
        !           261: Date: 3/24/88
        !           262: Version: 0.18
        !           263: Problem: use_string can cause uncaught Intmap exception
        !           264: Code:
        !           265:     - structure Foo =
        !           266:        struct
        !           267:          val x = use_stream(open_string "val _ = Foo.x;")
        !           268:        end;
        !           269: Messages: 
        !           270:     [opening <instream>]
        !           271:     [closing <instream>]
        !           272:     uncaught exception Runbind
        !           273: Comments: This code shouldn't work, but the Intmap exception should be caught.
        !           274: Priority: C
        !           275: --------------------------------------------------------------------------------
        !           276: 36. (L.26): overloading resolution and order of recursive definitions
        !           277: Submitter: Dave
        !           278: Date: 5/2/88
        !           279: Version: 0.18
        !           280: Problem: 
        !           281:     overloading resolution can depend on the order in which mutually
        !           282:     recursive definitions occur
        !           283: Code:
        !           284:     fun f x = length x
        !           285:     and g() = f "abc"
        !           286:       (* length is not resolved *)
        !           287:     fun g() = f "abc"
        !           288:     and f x = length x
        !           289:       (* length is resolved *)    
        !           290: Messages:
        !           291: Comments:
        !           292:     Maybe this will remain a "feature".
        !           293: Priority: A
        !           294: --------------------------------------------------------------------------------
        !           295: 40. (L.28): Exception aliasing (match compiler)
        !           296: Submitter: Dave
        !           297: Date: 5/12/88
        !           298: Version: 0.19
        !           299: Problem:
        !           300:    Match compiler doesn't cope with exception aliasing (through functor
        !           301:    parameters, for instance).
        !           302:    Exceptions in different structures with the same name, or identical
        !           303:    exceptions with different names can cause problems for the match
        !           304:    compiler.  Currently, in building the decision tree, the match
        !           305:    compiler examines constructor names to descriminate among them.
        !           306:    In a match like
        !           307:          A.foo =>
        !           308:        | B.foo =>
        !           309:    the second rule will be found redundant, even if the exceptions are
        !           310:    different.  And in
        !           311:          exception foo
        !           312:          exception bar = foo
        !           313: 
        !           314:          bar =>
        !           315:        | foo =>
        !           316:    the second rule will not be recognized as redundant.
        !           317:    The situation is even worse for exceptions which are functor parameters.
        !           318:    For example:
        !           319:        structure A = struct exception foo end
        !           320:        structure B = struct exception foo end
        !           321:        functor F(exception foo) =
        !           322:          struct
        !           323:            fun f A.foo = 1
        !           324:              | f foo = 2
        !           325:              | f B.foo = 3
        !           326:          end
        !           327:    Now in F(A.foo) the second case is redundant; in F(B.foo) the third case
        !           328:    is redundant; and in F(exception foo) no case is redundant.  Redundancy
        !           329:    can't be computed statically while compiling F; and the match compiler
        !           330:    can't build a fancy decision tree without watching for functor parameters.
        !           331:    Here, the only correct tree would be a case by case check; things get more
        !           332:    complicated when tuples are involved.
        !           333:    
        !           334:    One solution would be to assign stamps statically to exception declarations.
        !           335:    Exception specs would get a different class of stamp than exception
        !           336:    declarations.  This would allow us to correctly produce efficient matches
        !           337:    in most cases, and detect cases where the runtime-dependent check is
        !           338:    necessary.
        !           339: Code:
        !           340: Messages:
        !           341: Comments: a fairly nasty one!
        !           342: Priority: B
        !           343: --------------------------------------------------------------------------------
        !           344: 46. equality type checking and flexrecords
        !           345: Submitter: Dave
        !           346: Date: 6/3/88
        !           347: Version: 0.20
        !           348: Problem:
        !           349:     when flexrecords are used a nonequality type may be accepted in a context
        !           350:     where an equality record type is required
        !           351: Code:
        !           352:     fun f(r as {a,...},true) = (r = r)  (* checks only that a admits equality *)
        !           353:       | f({b,...},false) = b 3 (* oops, the b field is a function! *)
        !           354: Messages:
        !           355:     val f = fn : {a:''a,b:int -> bool} * bool -> bool
        !           356:     (* argument type is not an equality type *)
        !           357: Comments:
        !           358:     A fix probably requires a change in the way flexrecords are represented.
        !           359: Priority: A
        !           360: --------------------------------------------------------------------------------
        !           361: 48. printing of identity withtype declarations
        !           362: Submitter: Dave
        !           363: Date: 6/9/88
        !           364: Version: 0.20
        !           365: Problem:
        !           366:   A simple identity declaration in the withtype clause of a datatype declaration
        !           367:   will not be printed properly.
        !           368: Code:
        !           369:   datatype foo = A
        !           370:   withtype t = int;
        !           371: Messages:
        !           372:   datatype  foo
        !           373:   con A : foo
        !           374:   type  t = t
        !           375: Comments:
        !           376:   This happens because the backpatching of the type constructor puts the new
        !           377:   name in the defining type as well as in the defined type binding.
        !           378: Priority: B
        !           379: ---------------------------------------------------------------------------
        !           380: 63. curried, clausal def of infix function
        !           381: Submitter: Paulson
        !           382: Version: Version 0.20, 13 June 1988
        !           383: System: Sun3/SunOS
        !           384: Problem: parsing of infixes 
        !           385: Code: (minimal code fragment that causes bug)
        !           386:     - infix orelf;
        !           387:     - fun (f orelf g) x = 0;
        !           388:     Error: expected EQUAL, found RPAREN
        !           389:     Error: atomic expression expected
        !           390:     Error: declaration or expression expected, found RPAREN
        !           391: 
        !           392:     - fun f orelf g = fn x => 0;
        !           393:     val orelf = fn : 'a * 'b -> 'c -> int
        !           394: Comments: 
        !           395:   This use of an infix in a pattern seems legal and is accepted by Poly/ML.
        !           396: Priority: P
        !           397: ---------------------------------------------------------------------------
        !           398: 68. (E.72) spurious error message -- doesn't match sig spec
        !           399: Submitter: Nick
        !           400: Date: 11/24/88
        !           401: Version: 0.24
        !           402: System: Sun 3
        !           403: Code:
        !           404:        - structure S: sig val x: int end = struct val x = hd "s" end;
        !           405:        Error: operator and operand don't agree (tycon mismatch)
        !           406:          operator domain: 'S list
        !           407:          operand:         string
        !           408:          in expression:
        !           409:            hd "s"
        !           410:        Error: value type in structure doesn't match signature spec
        !           411:          name: x
        !           412:          spec:   int
        !           413:          actual: error
        !           414: Priority: A
        !           415: ---------------------------------------------------------------------------
        !           416: 69. (E.73) printing of exn spec in inferred signature
        !           417: Submitter: Nick
        !           418: Date: 11/24/88
        !           419: Version: 0.24
        !           420: System: Sun 3
        !           421: Code:
        !           422:        - structure Blah = struct exception BLAH end;
        !           423:        structure Blah :
        !           424:          sig
        !           425:            exception BLAH of exn  (* "of exn" should not appear *)
        !           426:          end
        !           427: Priority: A
        !           428: ---------------------------------------------------------------------------
        !           429: 70. (E.74) constructor shouldn't appear in printed structure signature
        !           430: Submitter: Nick
        !           431: Date: 11/24/88
        !           432: Version: 0.24
        !           433: System: Sun 3
        !           434: Code:
        !           435:        signature SIG =
        !           436:            sig
        !           437:                type t
        !           438:            end
        !           439: 
        !           440:        structure S:SIG =
        !           441:            struct
        !           442:                datatype t = foo of int
        !           443:                val x = 3
        !           444:            end
        !           445: Messages:
        !           446:        structure S :
        !           447:            sig
        !           448:                datatype t
        !           449:                  con foo : int -> t  (* shouldn't be printed *)
        !           450:            end
        !           451: Comment: constructor foo is not accessible as component of S
        !           452:     Also, from Dave Berry (2/2/89):
        !           453:     NJ ML prints the constructors of a datatype when that datatype is
        !           454:     matched against a "type" in a signature, even if the signature
        !           455:     doesn't include the constructors.
        !           456: 
        !           457:     This seems a trivial point (except that it's confusing for the novices on
        !           458:     the course we teach).  However, with some complicated programs the compiler
        !           459:     bombs out, raising the subscript exception.  You are left in the ML system,
        !           460:     but it won't compile your code.
        !           461: 
        !           462:     I don't have a small example of this.  It first hit me preparing
        !           463:     examples for the aforementioned course, and it's just hit me again.
        !           464: Priority: A
        !           465: ---------------------------------------------------------------------------
        !           466: 71. (E.75) Failure to restore enviroment after exception in "use"
        !           467: Submitter: Nick
        !           468: Date: 11/24/88
        !           469: Version: 0.24
        !           470: System: Sun 3
        !           471: Code:
        !           472:       For a file "y.sml" containing "val y = 4";
        !           473: 
        !           474:        - val x = (use "y.sml";
        !           475:                   let exception X in raise X end
        !           476:                  );
        !           477:        [opening y.sml]
        !           478:        val y = 4 : int
        !           479:        [closing y.sml]
        !           480:        uncaught exception X
        !           481:        - (* so far so good... *)
        !           482:        - x;
        !           483:        uncaught exception Runbind
        !           484: Comment: needs to be a protect around use to trap exceptions and restore env
        !           485: Priority: A
        !           486: ---------------------------------------------------------------------------
        !           487: 72. equality types with abstype declarations
        !           488: Submitter: kevin
        !           489: Date: 11/30/88
        !           490: Version: 0.24?
        !           491: System: Sun 3
        !           492: Code:
        !           493:     (* The following definition is accepted by the compiler, resulting in
        !           494:        the declaration test: ''a foo -> bool *)
        !           495: 
        !           496:     abstype 'a foo = Foo of 'a list
        !           497:     with fun test(Foo x) = (x = []) end;
        !           498: 
        !           499:     (* The next declaration fails with the error
        !           500:       Error: operator and operand don't agree (equality type required)
        !           501:       operator domain: ''S * ''S
        !           502:       operand:         'T foo * 'U foo
        !           503:       in expression:
        !           504:        x = Foo nil  *)
        !           505: 
        !           506:     abstype 'a foo = Foo of 'a list
        !           507:     with fun test(x as Foo _) = (x = Foo []) end;
        !           508: 
        !           509:     (* I'm not sure why one should be allowed and not the other - the old
        !           510:        Edinburgh compiler accepted both.  *)
        !           511: Priority: A
        !           512: ---------------------------------------------------------------------------
        !           513: 73. strange function definition
        !           514: Submitter: Trevor
        !           515: Date: 12/10/88
        !           516: Version: 0.24?
        !           517: System: vax
        !           518: Problem:
        !           519: Code:
        !           520:     - fun add-a x = x+1;
        !           521:     val a = fn : int -> int
        !           522:     - a 3;
        !           523:     val it = 4 : int
        !           524: Comments:
        !           525:     The intent was to have a hyphen in a function name
        !           526:     (something like "fun add_a ...".
        !           527: Priority: P
        !           528: ---------------------------------------------------------------------------
        !           529: 77. unparenthesized infix expressions in fun lhs
        !           530: Submitter: Dave Berry
        !           531: Date: 12/22/88
        !           532: Version: 0.24?
        !           533: Code: 
        !           534:     infix 4 %;
        !           535:     infix 3 %%;
        !           536: 
        !           537:     datatype foo = op % of int * int;
        !           538:     fun a % b %% c % d = 0;
        !           539: 
        !           540:     NJ ML accepts this, as does Edinburgh ML.  It is incorrect; brackets
        !           541:     are required as follows:
        !           542: 
        !           543:     fun (a % b) %% (c % d) = 0;
        !           544: 
        !           545:     This is defined on page 68 of the definition.  The lhs and rhs of the
        !           546:     infixed operator being defined are required to be atomic patterns.
        !           547: Priority: P
        !           548: ---------------------------------------------------------------------------
        !           549: 79. withtype
        !           550: Submitter: Simon (from abstract hardware) via Mike Fourman
        !           551: Date: 1/31/88
        !           552: Version: 0.24
        !           553: Problem:
        !           554:     "Did you know that the following is not valid ML?
        !           555: 
        !           556:        datatype type1 = T of type2 * type3
        !           557:        withtype type2 = int (* this could be a large expression *)
        !           558:        and      type3 = type2 * string;
        !           559: 
        !           560:     The reason is that the "datatype datbind withtype typbind" construct is
        !           561:     expanded out into "datatype datbind'; type typbind" where "datbind'" is
        !           562:     the the result of using "typbind" to expand "datbind". Note that this
        !           563:     construct does *not* expand "typbind" itself, so "type2" is out of scope
        !           564:     in its occurrence in "type3". This simultaneous definition property of
        !           565:     "withtype" is quite annoying, especially as there is no way to get the
        !           566:     effect of sequential definition (other than manually expanding out the
        !           567:     body of "type3" - but that is precisely the problem that "withtype" is
        !           568:     supposed to solve)."
        !           569: 
        !           570: Code:
        !           571:     - 
        !           572:        datatype type1 = T of type2 * type3
        !           573:        withtype type2 = int (* this could be a large expression *)
        !           574:        and      type3 = type2 * string;
        !           575: 
        !           576: 
        !           577:     - = = Error: Compiler bug: defineEqTycon/eqtyc 1
        !           578:     - 
        !           579:        datatype type1 = T of type2 * type3
        !           580:        withtype type3 = type2 * string
        !           581:        withtype type2 = int (* this could be a large expression *);
        !           582: 
        !           583: 
        !           584:     - = = Error: unbound type constructor (in datatype): type2
        !           585:     Error: unbound type constructor (in datatype): type2
        !           586:     Error: Compiler bug: defineEqTycon/eqtyc 1
        !           587:     - 
        !           588: Priority: A
        !           589: ---------------------------------------------------------------------------
        !           590: 80. simultaneous type declarations
        !           591: Submitter: Dave Berry
        !           592: Date: 2/1/89
        !           593: Version: 0.24
        !           594: Code:
        !           595:     - type type2 = int
        !           596:     = and  type3 = type2 * string;
        !           597:     type  type2 = int
        !           598:     type  type3 = type2 * string
        !           599: Comments:
        !           600:     This is wrong: type2 shouldn't be bound before the declaration of type3.
        !           601: Priority: B
        !           602: ---------------------------------------------------------------------------
        !           603: 83. unexpected parsing of erroneous datatype declaration
        !           604: Submitter: Carl Gunter
        !           605: Date: 2/24/88
        !           606: Version: 0.20
        !           607: Code:
        !           608:     - datatype complex = Complex (real,real);
        !           609:     datatype  complex
        !           610:     con Complex : complex
        !           611:     val it = (fn,fn) : (int -> real) * (int -> real)
        !           612: Comments:
        !           613:     implicit "val it = " inserted after constructor Complex breaks the
        !           614:     declaration into a valid datatype declaration and a top-level value
        !           615:     expression (implicit value declaration).  This could probably be 
        !           616:     detected and suppressed.
        !           617: Priority: P
        !           618: ---------------------------------------------------------------------------
        !           619: 85. bad error message for failed signature match
        !           620: Submitter: John Reppy
        !           621: Date: 3/6/89
        !           622: Version: 0.28
        !           623: Code:
        !           624:     - structure Foo : sig
        !           625:     =   type foo
        !           626:     =   val f : foo -> int
        !           627:     = end = struct
        !           628:     =   type Foo = int
        !           629:     =   fun f x = x
        !           630:     = end;
        !           631:     Error: unmatched type spec: foo
        !           632:     Error: Compiler bug: tycStamp
        !           633: Priority: A
        !           634: ---------------------------------------------------------------------------
        !           635: 86. incorrectly allows redefining of "="
        !           636: Submitter: Dave Berry
        !           637: Date: 3/15/89
        !           638: Version: 0.29
        !           639: Problem:
        !           640:     NJML handles the = symbol incorrectly in some cases.
        !           641: 
        !           642:     - val op = = op = ;
        !           643:     - nonfix =;
        !           644:     - = (true, true);
        !           645:     Error: declaration or expression expected, found EQUAL
        !           646: 
        !           647:     The = symbol may not be redefined (Definition, page 4).  The top definition
        !           648:     does seem to redefine =, despite the lack of response from the system.
        !           649:     I can't see anything in the Definition that forbids making = nonfix,
        !           650:     so I suppose it should be possible to use it in a nonfix way.
        !           651: 
        !           652:     Poly/ML gets this right.
        !           653: 
        !           654:     > val op = = op = ;
        !           655:     Error- Pattern expected but = was found
        !           656:     Exception static_errors raised
        !           657:     > nonfix =;
        !           658:     nonfix =
        !           659:     > = (true, true);
        !           660:     val it = true : bool
        !           661: 
        !           662:     It would be more pleasant if the error message said "Can't redefine =".
        !           663: 
        !           664:     Edinburgh ML 3.5 (for what it's worth) forbids the rebinding, and doesn't
        !           665:     allow = to be nonfix.
        !           666: 
        !           667:     - val op = = op = ;
        !           668: 
        !           669:     Parse error:
        !           670:        Was expecting a Prefix/infix/suffix-identifier
        !           671:     In:  ... val op <?> =
        !           672: 
        !           673:     - nonfix =;
        !           674: 
        !           675:     Parse error:
        !           676:        Insufficient repetition
        !           677:     In:  ... nonfix <?> =
        !           678: 
        !           679:     The "Insufficient repetition" message is the model of clarity we should all
        !           680:     be aiming for :-).
        !           681: Priority: C
        !           682: ---------------------------------------------------------------------------
        !           683: 87. execute subprocess dies on interrupt on blocked input
        !           684: Submitter: dbm
        !           685: Date: 3/19/89
        !           686: Version: 0.31
        !           687: System: Sun3/100, SunOS 4.0.1; VAX8550, V9
        !           688: Problem: interrupting blocked call of input from execute subprocess
        !           689:         kills subprocesss
        !           690: Code:
        !           691:        val (ins,outs) = execute "cat"
        !           692:        input ins 5;
        !           693:        ^Cuncaught exception Interrupt
        !           694: Messages:
        !           695:    After interrupt, System.system("ps x"), indicates that "cat"
        !           696:    subprocess has disappeared, and subsequent attempt to flush output
        !           697:    to outs raises exeption Io("output: write failed").
        !           698: Comments:
        !           699:    end_of_stream also blocks, and interrupting a call of end_of_stream
        !           700:    seems to have the same effect.
        !           701: Priority: B
        !           702: ---------------------------------------------------------------------------
        !           703: 89. continuation line string escape at beginning of string
        !           704: Submitter: dbm
        !           705: Date: 4/3/89
        !           706: Version: 0.33
        !           707: System: Sun 3, SunOS 4.0.1
        !           708: Code:
        !           709:     - "\                       (* CR after \ at beginning of string *)
        !           710:     - akdk";
        !           711:     Error: unclosed string
        !           712:     =                          (* second CR typed *)
        !           713:     Error: unclosed string
        !           714:     Error: unbound variable kdk
        !           715:     = ;
        !           716:     Error: operator is not a function
        !           717:       operator: string
        !           718:       in expression:
        !           719:        "" kdk
        !           720: Priority: B
        !           721: ---------------------------------------------------------------------------
        !           722: 90. secondary prompt is not set in multi-line strings and comments.
        !           723: Submitter: dbm and duba
        !           724: Date: 4/3/89
        !           725: Version: 0.33
        !           726: System: All
        !           727: Priority: B
        !           728: ---------------------------------------------------------------------------
        !           729: 92. uncaught Nth exception after type constructor arity mismatch in sigmatch
        !           730: Submitter: David Tarditi, Princeton University, [email protected]
        !           731: Date: 6/23/89
        !           732: Version: 0.33
        !           733: System: Vax/4.3 BSD
        !           734: Problem: Mismatching arities on types causes uncaught exception Nth
        !           735:         later in signature checking.
        !           736: 
        !           737: Example:
        !           738: 
        !           739: functor OrdSet(B : sig
        !           740:                        type elem
        !           741:                        val gt : elem * elem -> bool
        !           742:                        val eq : elem * elem -> bool
        !           743:                   end) =
        !           744: struct
        !           745: end
        !           746: 
        !           747: structure Bad =
        !           748:     struct
        !           749:        type 'a elem = int * 'a
        !           750:        val gt = fn ((a:int,_),(b,_)) => a > b
        !           751:        val eq = fn ((a:int,_),(b,_)) => a = b
        !           752:     end
        !           753: 
        !           754: structure  X = OrdSet(Bad)
        !           755: 
        !           756: Result:
        !           757: 
        !           758: Standard ML of New Jersey, Version 0.33, 1 April 1989
        !           759: val it = () : unit
        !           760: std_in, line 18: Error: mismatching tycon arities: elem
        !           761: uncaught exception Nth
        !           762: 
        !           763: Comments:
        !           764: 
        !           765: The uncaught exception Nth appears to occur while matching the actual types
        !           766: of eq and gt against the types in the signature of the formal
        !           767: structure parameter.
        !           768: Priority: A
        !           769: ---------------------------------------------------------------------------
        !           770: 95. infix declaration interferes with type parsing
        !           771: Submitter: David Tarditi, Princeton University, drt@notecnirp
        !           772: Date: 4/30/89
        !           773: Version: 0.33
        !           774: System: Vax/4.3 BSD
        !           775: Problem: Spurious declaration of infix for an identifier causes problems
        !           776:         when it is used as a type constructor later.
        !           777: 
        !           778: Sample Run:
        !           779: 
        !           780: Standard ML of New Jersey, Version 0.33, 1 April 1989
        !           781: val it = () : unit
        !           782: - type ('a,'b) --> = 'a -> 'b;
        !           783: type ('a,'b)  --> = 'a -> 'b
        !           784: 
        !           785: - val a = fn _ => 5;
        !           786: val a = fn : 'a -> int
        !           787: 
        !           788: - a : ('a,int) -->;
        !           789: val it = fn : 'a -> int
        !           790: 
        !           791: - infix -->;
        !           792: 
        !           793: - a : ('a,int) -->;
        !           794: Error: (user) bound type variable propagated out of scope
        !           795:   it : 'aU -> int
        !           796: 
        !           797: 
        !           798: Comments:
        !           799:        The declaration of an identifier to be infix should not
        !           800: affect type constructors.  Infix declarations apply only to data
        !           801: constructors and value identifiers.  The declaration of '-->' to
        !           802: be infix should not affect the use of '-->' as a type constructor,
        !           803: even though the declaration is spurious.
        !           804: 
        !           805: P.S.
        !           806:        Maybe there should be a way to declare type identifiers to be
        !           807: infix.  I was trying to declare '-->' to be infix because I was creating
        !           808: different kinds of arrows for my effects inference.  --> could denote
        !           809: a function that is pure, while -*-> could denote a function with an
        !           810: effect.  I need to do this to bootstrap the pervasive environment
        !           811: without assuming that all built-in functions have side-effects.
        !           812: 
        !           813: Priority: P
        !           814: ---------------------------------------------------------------------------
        !           815: 100. constructor not printed after open declaration
        !           816: Submitter: Nick Rothwell
        !           817: Date: 7/18/89
        !           818: Version: 0.33
        !           819: Problem:
        !           820:   In this case, a datatype is being printed as a type: the constructor isn't
        !           821:   shown (although it's still bound):
        !           822: Code:
        !           823: 
        !           824:     - signature X = sig datatype T = T end;
        !           825:     signature X =
        !           826:       sig
        !           827:        datatype T
        !           828:          con T : T
        !           829:       end
        !           830: 
        !           831:     - structure X: X = struct datatype T = T end;
        !           832:     structure X :
        !           833:       sig
        !           834:        datatype T
        !           835:          con T : T
        !           836:       end
        !           837: 
        !           838:     - open X;
        !           839:     type  T = T
        !           840: 
        !           841: Priority: A
        !           842: ---------------------------------------------------------------------------
        !           843: 104. Labels with leading zeroes should not be accepted (this is made
        !           844:      explicit on page 5 of version 3 of the Standard).
        !           845: Submitter: Simon Finn (simon%[email protected])
        !           846: Date: 7/28
        !           847: Version: 0.33
        !           848: Code:
        !           849:     - {0000002 = 999};
        !           850:     val it = {2=999} : {2:int}
        !           851: Priority: B
        !           852: ---------------------------------------------------------------------------
        !           853: 105. Large numeric labels are disallowed.    
        !           854: Submitter: Simon Finn (simon%[email protected])
        !           855: Date: 7/28
        !           856: Version: 0.33
        !           857: Code:
        !           858:     -  {9999999999999999999999 = 999};
        !           859: Messages:
        !           860:     Error: integer too large
        !           861:     Error: nonpositive integer label, found 0
        !           862: Priority: B
        !           863: ---------------------------------------------------------------------------
        !           864: 107. NJML disappears into an infinite loop when trying to parse large real numbers;
        !           865:      presumably some error recovery code is flakey.
        !           866: Submitter: Simon Finn (simon%[email protected])
        !           867: Date: 7/28
        !           868: Version: 0.33
        !           869: Code:
        !           870:     - 1.0E308;
        !           871:     val it = 1.0E308 : real
        !           872:     - 1.0E309;
        !           873:     Error: Real constant  out of range
        !           874:     - 2.0E308; (* wait a long time ... *)
        !           875:     val it = uncaught exception Interrupt
        !           876:     - 
        !           877: Comment:
        !           878: Furthermore, a failing program elaboration or evaluation (such as the above)
        !           879: should not rebind the variable "it" (ML Standard v3, rules 194 and 195).
        !           880: NJML sometimes does (as above).
        !           881: 
        !           882: Furthermore, trying to print "it" when it has been bound to such an
        !           883: exception sometimes seems to crash the system (it refuses to respond to
        !           884: further input); at other times the exception Runbind is raised.
        !           885: 
        !           886: Priority: A
        !           887: ---------------------------------------------------------------------------
        !           888: 109. sharing of datatypes not handled properly
        !           889: Submitter: Simon Finn (simon%[email protected])
        !           890: Date: 7/28
        !           891: Version: 0.33
        !           892: Code:
        !           893:     signature EQSIG =
        !           894:     sig
        !           895:       type r
        !           896:       datatype s = S of r
        !           897:           and t = T of s
        !           898:       sharing type r = t
        !           899:     end;
        !           900: 
        !           901:     functor F(X : EQSIG) =
        !           902:     struct
        !           903:       fun test(x : X.t) = (x = x);
        !           904:     end;
        !           905: Messages:
        !           906: 
        !           907:     signature EQSIG =
        !           908:       sig
        !           909:        type r
        !           910:        datatype s
        !           911:          con S : r -> s
        !           912:        datatype t
        !           913:          con T : s -> t
        !           914:       end
        !           915:     Error: operator and operand don't agree (equality type required)
        !           916:       operator domain: ''S * ''S
        !           917:       operand:         ?.t * ?.t
        !           918:       in expression:
        !           919:        x = x
        !           920:     Error: Compiler bug: abstractType
        !           921: 
        !           922: Comment:
        !           923:     Both are wrong, as the signature EQSIG elaborates to the same semantic object
        !           924:     as the following (which both treat correctly):
        !           925: 
        !           926:     signature EQSIG =
        !           927:     sig
        !           928:       type r
        !           929:       datatype s = S of t
        !           930:           and t = T of s
        !           931:       sharing type r = t
        !           932:     end;
        !           933: 
        !           934: Priority: A
        !           935: ---------------------------------------------------------------------------
        !           936: 110. val rec
        !           937: Submitter: Simon Finn, Abstract Hardware Ltd, [email protected]
        !           938: Date: 7/18/89
        !           939: Version: 0.33
        !           940: System: Sun3/SunOS 4.0
        !           941: Problem: val rec form of definition rejected
        !           942: Code:
        !           943: 
        !           944: - val x = 1 and rec y = fn z => z; (* should compile *)
        !           945: Error: expected an atomic pattern, found REC
        !           946: Error: expected EQUAL, found REC
        !           947: Error: atomic expression expected, found REC
        !           948: Error: declaration or expression expected, found REC
        !           949: 
        !           950: Comment: [Simon] the compiler should accept the above declaration.
        !           951: Comment: [Andrew] The compiler should not accept the above declaration;
        !           952:                  this is a case where the Def'n of SML is brain-damaged.
        !           953: Priority: C
        !           954: ---------------------------------------------------------------------------
        !           955: 111. local polymorphic definitions
        !           956: Submitter: Simon Finn, Abstract Hardware Ltd, [email protected]
        !           957: Date: 7/18/89
        !           958: Version: 0.33
        !           959: System: Sun3/SunOS 4.0
        !           960: Problem: local polymorphic definitions rejected
        !           961: Code:
        !           962: 
        !           963: - val q = let exception x of '_a in 1 handle x _ => 2 end;
        !           964: Error: type variable in exception type not weak enough
        !           965: 
        !           966: - local exception x of '_a in val q = 1 handle x _ => 2 end;
        !           967: Error: type variable in exception type not weak enough
        !           968: 
        !           969: 
        !           970: Comment: the compiler should accept both the above definitions,
        !           971:          which are valid, since the imperative type variable '_a
        !           972:          is *not* free in the top level declaration.
        !           973: Priority: A
        !           974: ---------------------------------------------------------------------------
        !           975: 112. equality
        !           976: Submitter: Simon Finn, Abstract Hardware Ltd, [email protected]
        !           977: Date: 7/18/89
        !           978: Version: 0.33
        !           979: System: Sun3/SunOS 4.0
        !           980: Problem: equality misbehaving
        !           981: Code:
        !           982: 
        !           983: (0.0 = ~0.0, 0.0 = ~ 0.0, ~0.0 = ~ 0.0);    (* (true,true,true) *)
        !           984: 
        !           985: infix eq; fun x eq y = x = y;
        !           986: (0.0 eq ~0.0, 0.0 eq ~ 0.0, ~0.0 eq ~ 0.0); (* (true,false,false) *)
        !           987: 
        !           988: infix eq; fun (x:real) eq y = x = y;
        !           989: (0.0 eq ~0.0, 0.0 eq ~ 0.0, ~0.0 eq ~ 0.0); (* (true,true,true) *)
        !           990: 
        !           991: Comment: the polymorphic equality function should give
        !           992:          consistent results, even when the type of its
        !           993:          argument is known to be real.
        !           994: Priority: A
        !           995: ---------------------------------------------------------------------------
        !           996: 113. empty declarations
        !           997: Submitter: Simon Finn, Abstract Hardware Ltd, [email protected]
        !           998: Date: 7/18/89
        !           999: Version: 0.33
        !          1000: System: Sun3/SunOS 4.0
        !          1001: Problem: Parsing empty declarations
        !          1002: Code:
        !          1003: 
        !          1004:     let val x = 1; (* empty declaration *) ; val y = 2 in x + y end;
        !          1005:     Error: expected IN, found SEMICOLON
        !          1006:     Error: atomic expression expected, found SEMICOLON
        !          1007:     Error: atomic expression expected, found VAL
        !          1008:     Error: expected END, found VAL
        !          1009:     Error: declaration or expression expected, found IN
        !          1010: 
        !          1011: Comment: the above program is syntactically correct.
        !          1012: Priority: P
        !          1013: ---------------------------------------------------------------------------
        !          1014: 115. cyclic signatures
        !          1015: Submitter: Simon Finn, Abstract Hardware Ltd, [email protected]
        !          1016: Date: 7/18/89
        !          1017: Version: 0.33
        !          1018: System: Sun3/SunOS 4.0
        !          1019: Problem: cyclic signatures
        !          1020: Code:
        !          1021: 
        !          1022:     (* shouldn't be allowed, since object (signature) is not cycle-free *)
        !          1023:     signature bad =
        !          1024:     sig
        !          1025:       structure A :
        !          1026:       sig
        !          1027:        structure B : sig end;
        !          1028:       end;
        !          1029:       sharing A = A.B;
        !          1030:     end;
        !          1031: 
        !          1032: Comment: NJML accepts the above signature declaration, which should be
        !          1033:          rejected because it elaborates to a cyclic semantic object;
        !          1034:          cyclic objects are not semantically admissible.
        !          1035:          Not a bug?  (signature will never match a structure)
        !          1036: Priority: C
        !          1037: ---------------------------------------------------------------------------
        !          1038: 116. pattern declares no variables warning (?)
        !          1039: Submitter: Simon Finn, Abstract Hardware Ltd, [email protected]
        !          1040: Date: 7/18/89
        !          1041: Version: 0.33
        !          1042: System: Sun3/SunOS 4.0
        !          1043: Problem: Missing warning message
        !          1044: Code:
        !          1045: 
        !          1046: let val _ = 1 in 2 end;
        !          1047: local val _ = 1 in val it = 2 end;
        !          1048: 
        !          1049: 
        !          1050: Comment: Each of the above should produce a "Pattern declares
        !          1051:          no variables" warning message, but neither does.
        !          1052: 
        !          1053:          Not a bug 
        !          1054: Priority: C
        !          1055: ---------------------------------------------------------------------------
        !          1056: 117. sharing and equality attributes
        !          1057: Submitter: Simon Finn, Abstract Hardware Ltd, [email protected]
        !          1058: Date: 7/18/89
        !          1059: Version: 0.33
        !          1060: System: Sun3/SunOS 4.0
        !          1061: Problem: problems with equality attribute
        !          1062: Code:
        !          1063: 
        !          1064: (***************************************************************************)
        !          1065: (* This is illegal in version 3 of the ML standard                         *)
        !          1066: (* s may only be elaborated to a non-equality type (+ extra bits)          *)
        !          1067: (* t may only be elaborated to an equality type (for consistency with its  *)
        !          1068: (* constructor environment)                                                *)
        !          1069: (* Hence s and t can't share                                               *)
        !          1070: (***************************************************************************)
        !          1071: 
        !          1072: signature BADSIG =
        !          1073: sig
        !          1074:   datatype s = Dummy of bool -> bool
        !          1075:   datatype t = Dummy of int
        !          1076:   sharing type s = t;
        !          1077: end;
        !          1078: 
        !          1079: Comment: NJML accepts this signature but shouldn't. Getting the
        !          1080:          equality attribute right in the presence of sharing
        !          1081:          constraints seems to be quite a tricky problem.
        !          1082: 
        !          1083: Priority: A
        !          1084: ---------------------------------------------------------------------------
        !          1085: 118. deviation from Definition, div and mod
        !          1086: Submitter: Simon Finn, Abstract Hardware Ltd, [email protected]
        !          1087: Date: 7/18/89
        !          1088: Version: 0.33
        !          1089: System: Sun3/SunOS 4.0
        !          1090: Problem: div / mod give non-standard results
        !          1091: Code:
        !          1092: 
        !          1093: fun divmod (m,n) = (m div n,m mod n);
        !          1094: (* should give (1,2)   *) divmod(5,3);   (* gives (1,2)   *)
        !          1095: (* should give (~2,1)  *) divmod(~5,3);  (* gives (~1,~2) *)
        !          1096: (* should give (~2,~1) *) divmod(5,~3);  (* gives (~1,2)  *)
        !          1097: (* should give (1,~2)  *) divmod(~5,~3); (* gives (1,~2)  *)
        !          1098: 
        !          1099: Comments: I'd like the initial dynamic basis to conform to the Standard.
        !          1100:           (More efficient, non-standard versions should be hidden away.)
        !          1101: Priority: A
        !          1102: ---------------------------------------------------------------------------
        !          1103: 119. deviation from Definition
        !          1104: Submitter: Simon Finn, Abstract Hardware Ltd, [email protected]
        !          1105: Date: 7/18/89
        !          1106: Version: 0.33
        !          1107: System: Sun3/SunOS 4.0
        !          1108: Problem: I/O functions are curried, Standard has them uncurried
        !          1109: Code:
        !          1110: 
        !          1111:     - input;
        !          1112:     val it = fn : instream -> int -> string
        !          1113: 
        !          1114: Comments: I'd like the initial dynamic basis to conform to the Standard.
        !          1115:           (More efficient, non-standard versions should be hidden away.)
        !          1116: Priority: C
        !          1117: ---------------------------------------------------------------------------
        !          1118: 120. deviation from Definition
        !          1119: Submitter: Simon Finn, Abstract Hardware Ltd, [email protected]
        !          1120: Date: 7/18/89
        !          1121: Version: 0.33
        !          1122: System: Sun3/SunOS 4.0
        !          1123: Problem: Prelude functions raise the wrong exceptions
        !          1124: Code:
        !          1125: 
        !          1126:     0.0 / 0.0; (* raises Overflow *)
        !          1127:     1.0 / 0.0; (* raises Real *)
        !          1128: 
        !          1129: Comments: I'd like the initial dynamic basis to conform to the Standard.
        !          1130:           (More efficient, non-standard versions should be hidden away.)
        !          1131: This one is even trickier; Poly/ML doesn't raise any exception at all
        !          1132: for these (it prints NaN.0 and Infinity.0 respectively).
        !          1133: Priority: A
        !          1134: ---------------------------------------------------------------------------
        !          1135: 126.  scope of explicit type variables
        !          1136: Submitter: Mads Tofte <mads%[email protected]>
        !          1137: Date: 7/11/89
        !          1138: Version: 0.33
        !          1139: Problem:
        !          1140: New Jersey ML (Version 33) does not accept the following declarations.
        !          1141: It complains that a user bound type variable escapes out of scope in `insert'.
        !          1142: But the scope of ''a and 'b is the whole of the fun declaration.  The problem
        !          1143: seems to be associated with mutual recursion.
        !          1144: 
        !          1145:   type (''a, 'b)map = (''a *  'b) list
        !          1146: 
        !          1147:   fun plus(l:(''a,'b)map ,[]: (''a, 'b)map ): (''a, 'b)map = l
        !          1148:     | plus(l,hd::tl) = plus(insert(l,hd), tl)
        !          1149:   and insert([], p) = [p]
        !          1150:     | insert((x,y)::rest, (x',y')) = 
        !          1151:         if x=x' then (x',y')::rest
        !          1152:         else (x,y) :: insert(rest,(x',y'));
        !          1153: 
        !          1154: Priority: A
        !          1155: ---------------------------------------------------------------------------
        !          1156: 127. sharing and equality types
        !          1157: Submitter: Mads Tofte <mads%[email protected]>
        !          1158: Date: 7/11/89
        !          1159: Version: 0.33
        !          1160: Problem: 
        !          1161: New Jersey ML does not accept the following functor declaration (it
        !          1162: complains that S.x is not of equality type).  According to the
        !          1163: Definition, two types share only if they have the same name (stamp).
        !          1164: In particular, since equality is an attribute of type names (Version
        !          1165: 3, page 16), one admits equality iff the other does (one cannot have
        !          1166: different ``views'' of equality).  
        !          1167: 
        !          1168: Presumably the problem is a bug in the unification of type names.
        !          1169: 
        !          1170: Code:
        !          1171:     functor f(structure S : sig type t val x: t end
        !          1172:              structure T : sig eqtype t end
        !          1173:              sharing S = T
        !          1174:             )=
        !          1175:     struct val b:bool = S.x = S.x
        !          1176:     end;
        !          1177:       
        !          1178: Priority: A
        !          1179: ---------------------------------------------------------------------------
        !          1180: 133. overloading resolution is weaker than Edinburgh SML or Poly ML
        !          1181: Submitter: Larry Paulson ([email protected])
        !          1182: Date: 5/8/89
        !          1183: Version: 0.33
        !          1184: Problem:
        !          1185: Code:
        !          1186:     datatype 'a tree = Stree of 'a list * (string * 'a tree) list
        !          1187:     fun insert ((key::keys, x), Stree(xs,alist)) =
        !          1188:          let fun inslist((keyi,tri)::alist) =
        !          1189:                    if key<keyi then alist else (keyi,tri) :: inslist alist
        !          1190:          in  Stree(xs, inslist alist)  end;
        !          1191: Messages:
        !          1192:     Error: overloaded variable "<" cannot be resolved
        !          1193: Priority: A
        !          1194: ---------------------------------------------------------------------------
        !          1195: 134. type checking
        !          1196: Submitter: 
        !          1197:   Erik Tarnvik 
        !          1198:   Department of Computing Science
        !          1199:   University of Umea
        !          1200:   SWEDEN
        !          1201:   [email protected]
        !          1202: Date: 5/12/89
        !          1203: Version: 0.33
        !          1204: System: Sun3
        !          1205: Problem:
        !          1206: The compiler reports a type clash were it shouldn't.
        !          1207: 
        !          1208: Code:
        !          1209:     type 'a ft = (int * 'a) list;
        !          1210: 
        !          1211:     fun f ([]:'a ft) x = []:'a ft
        !          1212:       | f (((y,fy)::l):'a ft) x = 
        !          1213:          if x = y
        !          1214:          then l:'a ft
        !          1215:          else (y,fy)::(f l x):'a ft
        !          1216: 
        !          1217:     and g (l:'a ft) (x,fx) = (x,fx) :: (f l x):'a ft;
        !          1218: 
        !          1219: Messages:
        !          1220:     type 'a  ft = (int * 'a) list
        !          1221:     line 10: Error: operator and operand don't agree (bound type var)
        !          1222:       operator domain: (int * 'aU) list
        !          1223:       operand:         'aU ft
        !          1224:       in expression:
        !          1225:        f l
        !          1226: Comments:
        !          1227: The Edinburgh SML (ver 3.3) does not report an error on this code.
        !          1228: If the 'and' in the last line is changed to 'fun', no error is reported.
        !          1229: I hope I haven't missunderstood something about SML. This is a bug, isn't it?
        !          1230: See #126.
        !          1231: Priority: 
        !          1232: ---------------------------------------------------------------------------
        !          1233: 135. eqtype vs abstype
        !          1234: Submitted: Bernard Sufrin (sufrin%[email protected])
        !          1235: Date: 7/26/89
        !          1236: Version: 0.33
        !          1237: Problem: interaction of abstype and eqtype
        !          1238: 
        !          1239: I ran into this problem whilst writing you a long note concerning
        !          1240: abstraction bindings structure bindings and their respect for type and
        !          1241: eqtype specifications. Here's a miniature version of the larger
        !          1242: problem.
        !          1243: 
        !          1244: We want a pair of types Open and Shut, and transfer functions between
        !          1245: them. The two signatures below are candidates for describing such a
        !          1246: structure: the latter leaves visible the equality on Open, the former
        !          1247: should not.
        !          1248: 
        !          1249:     signature T =
        !          1250:     sig
        !          1251:       type Shut
        !          1252:       type Open
        !          1253:       val Shut:Open->Shut
        !          1254:       and Open: Shut->Open
        !          1255:     end
        !          1256: 
        !          1257:     signature U =
        !          1258:     sig
        !          1259:       type Shut
        !          1260:       eqtype Open
        !          1261:       val Shut:Open->Shut
        !          1262:       and Open: Shut->Open
        !          1263:     end
        !          1264: 
        !          1265: Now we design a functor which simply wraps something up in order to shut it.
        !          1266: 
        !          1267:     functor absT(type Open)  =
        !          1268:     struct
        !          1269:       type Open = Open
        !          1270:       abstype Shut = SHUT of Open  with
        !          1271:        val Shut  = SHUT
        !          1272:        fun Open(SHUT x) = x
        !          1273:       end
        !          1274:     end
        !          1275: 
        !          1276: Now we instantiate it:
        !          1277: 
        !          1278:     structure b:T = absT(type Open=int)
        !          1279: 
        !          1280: Compiler yields:
        !          1281: 
        !          1282:     structure b :
        !          1283:     sig
        !          1284:       eqtype Shut         <----- can't be right, surely
        !          1285:       eqtype Open
        !          1286:       val Open : Shut -> Open
        !          1287:       val Shut : Open -> Shut
        !          1288:     end
        !          1289: 
        !          1290: The equality on Shut has leaked, despite the fact that the actual
        !          1291: representation of Shut is an abstype. (The same happens if absT is
        !          1292: itself constrained to yield a T)
        !          1293: 
        !          1294:     - b.Shut 3=b.Shut 4;
        !          1295:     val it = false : bool
        !          1296: 
        !          1297: On the other hand using an abstraction binding
        !          1298: 
        !          1299:     abstraction ab:T = absT(type Open=int)
        !          1300: 
        !          1301: Compiler yields, correctly,
        !          1302: 
        !          1303:     structure ab :
        !          1304:       sig
        !          1305:        type Shut
        !          1306:        type Open
        !          1307:        val Open : Shut -> Open
        !          1308:        val Shut : Open -> Shut
        !          1309:       end
        !          1310: 
        !          1311: but I cannot actually apply ab.Shut to an integer (its domain is not
        !          1312: int, but an opaque and different type, namely ab.Open).  Now let's try
        !          1313: 
        !          1314:     abstraction au:U = absT(type Open=int)
        !          1315: 
        !          1316: Compiler yields, correctly,
        !          1317: 
        !          1318:     structure au :
        !          1319:     sig
        !          1320:       type Shut                                    
        !          1321:       eqtype Open
        !          1322:       val Open : Shut -> Open
        !          1323:       val Shut : Open -> Shut
        !          1324:     end
        !          1325: 
        !          1326: but I still can't apply au.Shut to an integer. Incidentally in my
        !          1327: original note I asked (a) whether I ought to be able to, (b) if so,
        !          1328: whether eqtype was not getting a bit overloaded [equality visible AND
        !          1329: representation visible] (c) if not, how could one do this sort of
        !          1330: thing at all?
        !          1331: 
        !          1332: Meanwhile
        !          1333: 
        !          1334:     structure argh:U = absT(type Open=int)
        !          1335: 
        !          1336: still makes Open and Shut both eqtypes.  More bizarrely, we have
        !          1337: 
        !          1338:     abstype opaque = opaque of int with
        !          1339:      val hide = opaque
        !          1340:      val show = fn(opaque x)=>x
        !          1341:     end
        !          1342: 
        !          1343:     structure biz:T = absT(type Open=opaque)
        !          1344: 
        !          1345: Compiler yields
        !          1346: 
        !          1347:     structure biz :
        !          1348:       sig
        !          1349:        eqtype Shut                 <--- wow!
        !          1350:        type Open
        !          1351:        val Open : Shut -> Open
        !          1352:        val Shut : Open -> Shut
        !          1353:       end
        !          1354: 
        !          1355: Shut is now an eqtype despite being an abstype whose representation
        !          1356: includes another abstype!
        !          1357: 
        !          1358: Priority: A
        !          1359: ---------------------------------------------------------------------------
        !          1360: 136. linkdata problem
        !          1361: Submitter: John Reppy (ulysses!jhr, [email protected])
        !          1362: Date: 7/12/89
        !          1363: Version: 0.36
        !          1364: System: Sun 3, SunOS 4.0.3
        !          1365: Problem: failure to build
        !          1366: Code:
        !          1367: When I tried to build 0.36 on the sun-3, I got the message
        !          1368: 
        !          1369:        ld: : Is a directory
        !          1370: 
        !          1371: on the load of the runtime system.  The problem is with the allmo.o
        !          1372: file.  I am able to build the system using "-noshare".
        !          1373: 
        !          1374: Priority: A
        !          1375: ---------------------------------------------------------------------------
        !          1376: 137. profiler failure
        !          1377: Submitter: Ian Dickinson,  HP Labs, Information Systems Centre,    Bristol
        !          1378:             ijd%[email protected]
        !          1379: Date: 9/28/89
        !          1380: Version: 0.33
        !          1381: System: HP 9000 HP-UX 6.3
        !          1382: Problem: 
        !          1383: I have a small, compute intensive program (around 2K lines of code including
        !          1384: comments).  With the profiler turned on, njml fails repeatably at the first
        !          1385: major collect:
        !          1386: 
        !          1387:         - test 30 30;
        !          1388:         Case 30: TOLUENE, A,O-DICHLORO
        !          1389: 
        !          1390:         [Major collection... 54% used (2332228/4249436), 2483 msec]
        !          1391:         unknown signal: 20
        !          1392: 
        !          1393:         Process SML exited abnormally with code 148
        !          1394: 
        !          1395: Priority: A
        !          1396: --------------------------------------------------------------------------------
        !          1397: 139.
        !          1398: Submitter: Brian Boutel, [email protected]
        !          1399: Date: 9 November 1989
        !          1400: Version: 0.36 & later
        !          1401: System: HP/Sun 3
        !          1402: Problem: compiling with gcc doesn't work 
        !          1403: Description:
        !          1404: 
        !          1405:     I have been trying again to port sml to H-P 68030 boxes running
        !          1406:     MORE/bsd, using the Gnu C  compiler. 
        !          1407: 
        !          1408:     We have a mix of Sun3 and H-P machines, and, although I have installed
        !          1409:     sml on the suns, it would be convenient to have it available on the H-Ps as well.
        !          1410: 
        !          1411:     The H-P port has not worked, and to separate the problems arising from
        !          1412:     the Operating System from those arising from the use of gcc, I have
        !          1413:     tried building sml on the suns with gcc (using the -traditional
        !          1414:     option). The build completes, but the resulting sml dies immediately
        !          1415:     while doing a major garbage collection. It does not get as far as
        !          1416:     announcing itself as Standard ML of .....
        !          1417:     I have tried various options, (optimiser on/off some of the gcc -f
        !          1418:     options) without effect. Have you tried gcc? I am anxious to persue
        !          1419:     this as  I think getting a gcc compiled version to run on the suns is
        !          1420:     the right first step towards porting to the H-Ps. Can you offer any suggestions?
        !          1421: 
        !          1422:     I am using sml version 0.36.  ( I tried today to ftp to
        !          1423:     research.att.com to check for a later version, but found an empty
        !          1424:     directory when logging on as anonymous, and was refused permission to
        !          1425:     log on as mldist.)
        !          1426: 
        !          1427: 
        !          1428:     Changes made to the source are summarised as
        !          1429: 
        !          1430:     ------
        !          1431:     gnu C compiler requires f68881 to be changed to m68881
        !          1432:     Changed in makeml by introducing $CCOMP, set to GNUCC for machine hp300,
        !          1433:     otherwise "", and testing it in defining CFL for M68
        !          1434: 
        !          1435:     ----------------
        !          1436:     for H-P, sys/exec.h defines MID_HP300 instead of M_68020
        !          1437:     linkdata.c and export.c have conditional code if HP300 defined
        !          1438:     makeml has to pass HP300 to make for linkdata
        !          1439:     -------------
        !          1440:     for H-P, callgc.c has FPE_TRAPV_TRAP undefined, and
        !          1441:     TRAPV returns FPE_INTOVF_TRAP
        !          1442:     so FPE_TRAPV_TRAP is defined as FPE_INTOVF_TRAP in callgc.c
        !          1443:     ----------
        !          1444:     _minitfp_ and _fp_state_mc68881 not defined anywhere for H-P
        !          1445:     .globl omitted if HP300 in M68.prim.s
        !          1446:     --------------------
        !          1447:     run dies because stack clobbered by apply
        !          1448:     Registers saved ala NeXT/MACH in saveregs/restoreregs in prim.s if GNUCC
        !          1449: Priority: B
        !          1450: --------------------------------------------------------------------------------
        !          1451: 141. interrupting gc dumps core
        !          1452: Submitter: [email protected] (Peter Buneman)
        !          1453: Date: 18 November 1989
        !          1454: Version: 0.39
        !          1455: System: ??
        !          1456: Problem:
        !          1457:     I've found occasions on which our current version of ML goes a bit
        !          1458:     flakey after being interrupted during garbage collection.  I haven't
        !          1459:     been able to pin it down until now.  The following interactive session
        !          1460:     appears to be repeatable.
        !          1461: Code:
        !          1462:     % sml
        !          1463:     Standard ML of New Jersey, Version 0.39, 8 September 1989
        !          1464:     val it = () : unit
        !          1465:     - fun foo() = 1::foo();
        !          1466:     val foo = fn : unit -> int list
        !          1467:     - foo();
        !          1468: 
        !          1469:     [Major collection...
        !          1470:     [Increasing heap to 7144k]
        !          1471:      70% used (1752720/2487664), 4810 msec]
        !          1472: 
        !          1473:     [Increasing heap to 7280k]
        !          1474: 
        !          1475:     [Major collection... 62% used (2484132/3975316), 7580 msec]
        !          1476:                  *** I typed <cntrl>C during this garbage collection
        !          1477:     [Increasing heap to 11648k]
        !          1478:     uncaught exception Interrupt
        !          1479:     - fun bar() = bar();
        !          1480:     val bar = fn : unit -> 'a
        !          1481:     - bar();      *** I did not type <cntrl>C here !!
        !          1482:     uncaught exception Interrupt
        !          1483:     - bar();      *** nor here!!
        !          1484:     uncaught exception Interrupt
        !          1485:     - 
        !          1486: Comments:
        !          1487:     In 0.43d2 I can't repeat this behavior, but interrupting during gc causes
        !          1488:     a bus error or segmentation fault. [dbm]
        !          1489: Priority: A
        !          1490: --------------------------------------------------------------------------------
        !          1491: 142. import incompatible with interpreter only image
        !          1492: Submitter: Bernard Sufrin <sufrin%[email protected]>
        !          1493: Date: 27 Sept 1989
        !          1494: Version: 0.39
        !          1495: System: Sun 3 ?
        !          1496: Problem: import into interpreter
        !          1497: Description:
        !          1498:     Problem: it is not possible to import precompiled stuff; the compiler 
        !          1499:     decides that the .bin file is not in the right format; tries to recompile,
        !          1500:     and fails for lack of a code generator.
        !          1501: 
        !          1502:     Here's an example...
        !          1503: 
        !          1504:     - import "/prg/pl/sml/lib/lex";
        !          1505:     [reading /prg/pl/sml/lib/lex.bin... ]
        !          1506:     [/prg/pl/sml/lib/lex.bin is the wrong format; recompiling]
        !          1507:     [closing /prg/pl/sml/lib/lex.bin]
        !          1508:     [reading /prg/pl/sml/lib/lex.sml]
        !          1509:       [reading /prg/pl/sml/lib/lib/lib/extend.bin... ]
        !          1510:       [/prg/pl/sml/lib/lib/lib/extend.bin is the wrong format; recompiling]
        !          1511:       [closing /prg/pl/sml/lib/lib/lib/extend.bin]
        !          1512:       [reading /prg/pl/sml/lib/lib/lib/extend.sml]
        !          1513:     /prg/pl/sml/lib/lib/lib/extend.sml, line 52: Error: Compiler bug: no code generator!
        !          1514:       [closing /prg/pl/sml/lib/lib/lib/extend.sml]
        !          1515:     [closing /prg/pl/sml/lib/lex.sml]
        !          1516:     IMPORT failed (compile-time exception: Syntax)
        !          1517: 
        !          1518:     When trying to reproduce the import bug
        !          1519:     you might try making the dependency graph more than three arcs deep.
        !          1520: 
        !          1521: Comments:
        !          1522:     Obviously we don't want to have to dispense with import
        !          1523:     when using the intepreter-only (typically it'd be students loading
        !          1524:     precompiled libraries), but I presume we don't want the complication of
        !          1525:     lambda-formatted bin files as well as machine code bin files.  May I
        !          1526:     propose the following:
        !          1527: 
        !          1528:     import from an ionly system should behave like import in the cg system if
        !          1529:     everything is up-to-date.
        !          1530: 
        !          1531:     if something is out of date, then import should either abort, or behave
        !          1532:     like use (I prefer the latter, I think, but you might make it
        !          1533:     controllable from a System.Control variable).
        !          1534: Priority: A?
        !          1535: --------------------------------------------------------------------------------
        !          1536: 143.
        !          1537: Submitter: Jawahar Malhotra (malhotra%[email protected])
        !          1538: Date: 26 October 1989
        !          1539: Version: ??
        !          1540: System: ??
        !          1541: Problem: use dumping core on magic input file length
        !          1542: Description:
        !          1543:     I have a source file which contains a signature definition and a
        !          1544:     functor definition. When I load it using the "use" statement, the
        !          1545:     compiler responds with the signature defn and the functor defn but
        !          1546:     then dumps core just before its prints the [<closing file>] line.
        !          1547:     Strangely, if I add another blank line to the file, everything is 
        !          1548:     OK. If you like, I can mail you the file; please let me know if
        !          1549:     you would like the file.
        !          1550: 
        !          1551:     Here is a reproduction of the compiler's output:
        !          1552: 
        !          1553:     - use "oareadattr.sml";
        !          1554:     [opening oareadattr.sml]
        !          1555:     signature OAREADATTR = ...
        !          1556:     ...
        !          1557:     ...
        !          1558:       end
        !          1559:     functor OAReadAttrFun : <sig>
        !          1560:     Segmentation Fault (core dumped)
        !          1561: Comments:
        !          1562: Priority: A
        !          1563: --------------------------------------------------------------------------------
        !          1564: 144. not waiting for child process
        !          1565: Submitter: Jawahar Malhotra, Meta Software; malhotra%[email protected]
        !          1566: Date: 20 Oct 89
        !          1567: Version: 0.33
        !          1568: System: SUN OS 3.5
        !          1569: Problem:       
        !          1570:        njsml doesn't wait for child process (created by a call to
        !          1571:        execute) to terminate. Suppose I execute the following 
        !          1572:        sml stmt:
        !          1573: 
        !          1574:        - execute "ls /users/malhotra";
        !          1575: 
        !          1576:        njsml creates a child process in which it runs ls. When ls 
        !          1577:        is done, it does an exit(0). In order for the exit to
        !          1578:        complete, its parent process (njsml in this case) should
        !          1579:        do a wait(). However, njsml doesn't do this and hence the
        !          1580:        "ls" process blocks on its exit and remains until njsml
        !          1581:        exits. The state of this process (as displayed by "ps") is:
        !          1582: 
        !          1583:        malhotra  2376  0.0  0.1    0    0 p2 Z     0:00 <exiting>
        !          1584: 
        !          1585: Comments: 
        !          1586:        One fix would be to prevent the process created by "execute" from
        !          1587:        being njsml's child. In this case, njsml would not have to wait to
        !          1588:        collect the child's termination status. This can be done by
        !          1589:        forking twice. Hence the code for execute might look like:
        !          1590:        (assume njsml is process p1)
        !          1591: 
        !          1592:        ------------------------------------------------------------
        !          1593: 
        !          1594:        /* in process p1 */
        !          1595: 
        !          1596:        if (fork() == 0)        {       /* in p2 */
        !          1597:                if (fork() == 0) {      /* in p3 */
        !          1598:                        .........                       
        !          1599:                        execl(......);
        !          1600:                        .......
        !          1601:                }
        !          1602:                else {                          /* in p2 */
        !          1603:                        exit(0);
        !          1604:                }
        !          1605:        }
        !          1606:        
        !          1607:        /* in p1 */
        !          1608: 
        !          1609:        wait(0);                        /* wait for p2 to exit */
        !          1610: 
        !          1611:        ------------------------------------------------------------    
        !          1612: 
        !          1613:        Another fix (maybe easier to implement) is to install a signal
        !          1614:        handler for SIGCHLD.
        !          1615: 
        !          1616:        signal(SIGCHLD, ack);
        !          1617: 
        !          1618:        where ack() is simply:
        !          1619: 
        !          1620:        ack()
        !          1621:        {
        !          1622:          wait(0);
        !          1623:        }
        !          1624: Final Comment:
        !          1625: You may remember that I once mentioned a problem with the processes
        !          1626: created by "execute". I have  a solution which I thought I'd share
        !          1627: with you. I use the wait fn call:
        !          1628: 
        !          1629: fun wait status = 
        !          1630:   System.Unsafe.syscall(84, [System.Unsafe.cast status], 1);
        !          1631: 
        !          1632: For example, I could do
        !          1633: 
        !          1634:        - execute "ls .";
        !          1635:        > val....
        !          1636:        - ......
        !          1637: 
        !          1638:        - wait(0);
        !          1639:        > val it = <pid of child>;
        !          1640: 
        !          1641: This will also be useful in predefining a sync "execute" i.e.
        !          1642: 
        !          1643:        val sync_execute  = fn file => (execute file; wait(0));
        !          1644: 
        !          1645: 
        !          1646: Priority: B
        !          1647: --------------------------------------------------------------------------------
        !          1648: 145. stale top-level continuations cause type bugs
        !          1649: Submitter: Andrzej Filinski, CMU Computer Science ([email protected])
        !          1650: Date: Oct 11, 1989
        !          1651: Version: 0.39 (8 September 1989)
        !          1652: System: Sun3/4.3BSD
        !          1653: Problem: Capturing top-level continuation messes up the type system
        !          1654: Code:
        !          1655: 
        !          1656:     val cl = ref([]:int cont list);
        !          1657:     callcc (fn k=>(cl:=[k]; 42));
        !          1658:     val u = throw (hd (!cl)) 65; (* value 65 with universal type! *)
        !          1659:     u+1;     (* u as integer *)
        !          1660:     u^"str"; (* u as string *)
        !          1661:     u:bool;  (* u as boolean (cannot print) *)
        !          1662:     u:real;  (* u as real (core dump) *)
        !          1663: 
        !          1664: Comments: This may be a tricky problem, i.e. it is not quite clear
        !          1665: what the "right" behavior should be when the top-level continuation
        !          1666: is captured and carried across commands. Please don't take this as a
        !          1667: criticism of callcc/throw in general, though; they're great! Any plans
        !          1668: for integrating them more deeply in the language, like exceptions?
        !          1669: Priority: B
        !          1670: --------------------------------------------------------------------------------
        !          1671: 149. infinite gc loop with insufficient swap space
        !          1672: Submitter:  [email protected] (John Reppy)
        !          1673: Date: 18 Sept 89
        !          1674: Version: 0.39
        !          1675: System: Vax
        !          1676: Problem: 
        !          1677:     SML/NJ is being used at Cornell for a course this semester, and we've
        !          1678:     run into a problem with it on multi-user vaxen.  If there isn't sufficient
        !          1679:     swap space for the system to run, it seems to get into an infinite loop
        !          1680:     of garbage collection attempts.  I should fail gracefully in this situation.
        !          1681: Priority: A
        !          1682: --------------------------------------------------------------------------------
        !          1683: 150. incomplete sharing spec accepted
        !          1684: Submitter:  Simon Finn <simon%[email protected]>
        !          1685: Date: 13 Sept 89
        !          1686: Version: 0.33
        !          1687: Problem:
        !          1688:     Both NJML (v0.33) and Poly/ML (v1.80x) erroneously parse the following:
        !          1689: 
        !          1690:     signature SIG =
        !          1691:     sig
        !          1692:       type t
        !          1693:       sharing type t
        !          1694:     end;
        !          1695: Comments:
        !          1696:     The above signature is illegal, since sharing constraints must involve
        !          1697:     at least two types / structures ("n >= 2" in section 3.5, figure 7).
        !          1698: 
        !          1699:     This bug was found by Mike Crawley.
        !          1700: Priority: A
        !          1701: --------------------------------------------------------------------------------
        !          1702: 151. can't limit length of list printed
        !          1703: Submitter:  Lawrence C Paulson <lcp%[email protected]>
        !          1704: Date: 14 Sept 1989
        !          1705: Version: ??
        !          1706: Problem:
        !          1707:     How do you tell New Jersey ML not to print all the elements of a list?
        !          1708:     System.Control.Print.printDepth seems to consider nesting only.
        !          1709: Code:
        !          1710:     - take(100,ms);
        !          1711:     val it = [1861294,62685628,105212158,14112418,78287461,35512822,180290056,316473
        !          1712:     64,72270388,168319897,212829007,43941079,142303594,174252739,117587239,56623288,
        !          1713:     96050461,46119052,152678905,140061256,13973941,209088847,109015732,167261566,142
        !          1714:     82215,159257329,69147538,162991570,121739197,19339324,52452037,18146911,23268574
        !          1715:     ,183534766,93272557,163056892,193407172,50009149,131379349,28143469,114167002,14
        !          1716:     8862536,85731877,182107423,28619248,67440382,145320439,121674259,172092145,16412
        !          1717:     2099,196052140,141367123,32002813,17851816,198701119,46866244,196351819,12166451
        !          1718:     8,163288573,14499193,10976578,64526104,139008271,417145,67962574,64746709,994460
        !          1719:     5,117181366,115999456,124879621,188830621,158322193,82998094,187333183,178599706
        !          1720:     ,158794345,17054389,62405431,142521907,182072470,22294474,162171034,163367647,12
        !          1721:     3860254,25498117,13136599,105899185,53939356,184226566,191249065,66913411,177659
        !          1722:     797,114495331,28730221,76001191,104114101,180588016,60920215,151887592,208100422
        !          1723:     ] : int list
        !          1724: 
        !          1725:     - [[[[[[[[[[[4]]]]]]]]]]];
        !          1726:     val it = [[[[[#]]]]] : int list list list list list list list list list list list
        !          1727:     -
        !          1728: Priority: A
        !          1729: --------------------------------------------------------------------------------
        !          1730: 152. floating point errors
        !          1731: Submitter: Lawrence C Paulson <lcp%[email protected]>
        !          1732: Date:  Thu, 14 Sep 89
        !          1733: Version: ??
        !          1734: Problem:
        !          1735:     Why cannot New Jersey handle integers that are well within the maximum
        !          1736:     available on the hardware?
        !          1737: Code:
        !          1738:     - exp(31.0 * ln 2.0);
        !          1739:     val it = 2147483648.0 : real
        !          1740: 
        !          1741:     - floor 2000000000.0;
        !          1742:     uncaught exception Floor
        !          1743: Priority: A?  (partly fixed in 0.43?)
        !          1744: --------------------------------------------------------------------------------
        !          1745: 153. interrupting corouting loop dumps core
        !          1746: Submitter: Bernard Sufrin <sufrin%[email protected]>
        !          1747: Date:  Sep 15 11:14:13 1989
        !          1748: Version: 0.43
        !          1749: System: Sun 3
        !          1750: Problem: producer consumer segementation fault
        !          1751:         interrupt consumer(producer) with a single ^c to cause a segmentation
        !          1752:        fault
        !          1753: Code:
        !          1754:     datatype state = S of state cont;
        !          1755: 
        !          1756:     fun  resume(S k: state) : state = callcc( fn  k':state cont => throw k (S k'))
        !          1757: 
        !          1758:     fun  initiate(p:state -> unit) = callcc( fn  k : state cont => (p(S k); S k))
        !          1759: 
        !          1760:     val  buf = ref 0;
        !          1761: 
        !          1762:     fun  producer(s:state):unit =
        !          1763:     let  val  n=ref 0
        !          1764:        val ccont : state ref = ref(resume s)
        !          1765:     in
        !          1766:        while true do (inc n; buf := !n; ccont := resume(!ccont))
        !          1767:     end
        !          1768: 
        !          1769:     fun  consumer(prod: state->unit) : unit =
        !          1770:     let  val pcont = ref(initiate prod) in
        !          1771:        while true do (pcont := resume(!pcont); print (!buf))
        !          1772:     end
        !          1773: Priority: A
        !          1774: --------------------------------------------------------------------------------
        !          1775: 154. import smashing memory
        !          1776: Submitter: Benjamin Pierce, CMU ([email protected])
        !          1777: Date: 11/34/89
        !          1778: Version: 0.41
        !          1779: System: Sun3/SunOS 3.5.2
        !          1780: Problem: import seems to be smashing memory
        !          1781: Comments:
        !          1782:     I've included a minimal version of program that exercises this bug on
        !          1783:     my machine.  Slightly different versions give different incorrect
        !          1784:     results, or simply fail with bus errors.  Removing the first line of
        !          1785:     tconst.sml (the import of globals, which is never used here) gives the
        !          1786:     correct answer.
        !          1787: Transcript:
        !          1788:     Standard ML of New Jersey, Version 0.41, 25 October 1989
        !          1789:     val it = () : unit
        !          1790:     - use "main.sml";
        !          1791:     [opening main.sml]
        !          1792:     val it = () : unit
        !          1793:     [reading checker.sml]
        !          1794:       [reading tconst.sml]
        !          1795:        [reading globals.sml]
        !          1796:        [closing globals.sml]
        !          1797:        [writing globals.bin... done]
        !          1798:       [closing tconst.sml]
        !          1799:       [writing tconst.bin... done]
        !          1800:     [closing checker.sml]
        !          1801:     [writing checker.bin... done]
        !          1802:     signature GLOBALS
        !          1803:     signature CHECKER
        !          1804:     signature TCONST
        !          1805:     functor TConstFun : <sig>
        !          1806:     functor GlobalsFun : <sig>
        !          1807:     functor CheckerFun : <sig>
        !          1808:     structure TConst
        !          1809:     val it = "\000\^VG\200" : ?.t                   <--- Should be "int"
        !          1810:     [closing main.sml]
        !          1811:     val it = () : unit
        !          1812:     - 
        !          1813: 
        !          1814: Code:
        !          1815:     (* ------------------------  globals.sml: ---------------------- *)
        !          1816:     signature GLOBALS = sig
        !          1817: 
        !          1818:     val member: ''a -> ''a list -> bool
        !          1819: 
        !          1820:     end
        !          1821: 
        !          1822: 
        !          1823:     functor GlobalsFun() : GLOBALS = struct
        !          1824: 
        !          1825:     fun member x [] = false
        !          1826:       | member x (y::l) = (x=y) orelse (member x l)
        !          1827: 
        !          1828:     end
        !          1829: 
        !          1830: 
        !          1831:     (* ------------------------  tconst.sml: ---------------------- *)
        !          1832:     import "globals";
        !          1833: 
        !          1834:     signature TCONST = sig
        !          1835: 
        !          1836:     type t
        !          1837: 
        !          1838:     val from_string: string -> t
        !          1839: 
        !          1840:     end
        !          1841: 
        !          1842:     functor TConstFun((*structure Globals:GLOBALS*)): TCONST = struct
        !          1843: 
        !          1844:     exception IllegalTConst of string
        !          1845: 
        !          1846:     type t = string
        !          1847: 
        !          1848:     fun member x [] = false
        !          1849:       | member x (y::l) = (x=y) orelse (member x l)
        !          1850: 
        !          1851:     fun from_string s = if not (member s ["int", "real", "bool"])
        !          1852:                       then raise IllegalTConst(s)
        !          1853:                       else s
        !          1854: 
        !          1855:     end
        !          1856: 
        !          1857: 
        !          1858:     (* ------------------------  checker.sml: ---------------------- *)
        !          1859:     import "tconst";
        !          1860: 
        !          1861:     signature CHECKER = sig
        !          1862: 
        !          1863:     end (* CHECKER *)
        !          1864: 
        !          1865: 
        !          1866:     functor CheckerFun() : CHECKER = struct
        !          1867: 
        !          1868: 
        !          1869:     end (* CheckerFun *)
        !          1870: 
        !          1871: 
        !          1872:     (* ------------------------  main.sml: ---------------------- *)
        !          1873:     System.Control.Print.signatures := false;
        !          1874: 
        !          1875:     import "checker";
        !          1876: 
        !          1877:     (* structure Globals:GLOBALS = GlobalsFun(); *)
        !          1878:     structure TConst:TCONST = TConstFun((*structure Globals=Globals*));
        !          1879: 
        !          1880:     TConst.from_string "int";
        !          1881: 
        !          1882: Priority: A
        !          1883: --------------------------------------------------------------------------------
        !          1884: 155. Compiler bug caused by of missing structure
        !          1885: Submitter: Banjamin Pierce ([email protected])
        !          1886: Date: 11/3/89
        !          1887: Version: 0.39
        !          1888: System: Sun3/SunOS
        !          1889: Problem: Missing structure component shows up later as compiler bug
        !          1890: Transcript:
        !          1891: 
        !          1892:     Standard ML of New Jersey, Version 0.39, 8 September 1989
        !          1893:     - use "compilerbug.sml";
        !          1894:     [opening compilerbug.sml]
        !          1895:     val it = () : unit
        !          1896:     signature GLOBALS
        !          1897:     functor GlobalsFun : <sig>
        !          1898:     signature SYMBOL
        !          1899:     functor SymbolFun : <sig>
        !          1900:     signature TCONST
        !          1901:     functor TConstFun : <sig>
        !          1902:     signature AST
        !          1903:     functor AstFun : <sig>
        !          1904:     structure Globals
        !          1905:     structure TConst
        !          1906:     structure Symbol
        !          1907:     compilerbug.sml, line 225: Error: unmatched structure spec: TConst
        !          1908:     compilerbug.sml, line 225: Error: Compiler bug: TypesUtil.lookTycPath.1
        !          1909:     [closing compilerbug.sml]
        !          1910:     - 
        !          1911: 
        !          1912: Code:
        !          1913: 
        !          1914: System.Control.Print.signatures := false;
        !          1915: 
        !          1916: signature GLOBALS = sig
        !          1917: 
        !          1918: exception NotImplemented of string
        !          1919: 
        !          1920: val listtostring: ('a -> string) 
        !          1921:               -> string -> string -> string 
        !          1922:               -> ('a list)
        !          1923:               -> string
        !          1924: 
        !          1925: val member: ''a -> ''a list -> bool
        !          1926: 
        !          1927: end
        !          1928: 
        !          1929: functor GlobalsFun() : GLOBALS = struct
        !          1930: 
        !          1931: exception NotImplemented of string
        !          1932: 
        !          1933: fun listtostring f init med fin is =
        !          1934:     let fun lts [] = ""
        !          1935:           | lts [i] = (f i)
        !          1936:           | lts (i::is) = (f i) ^ med ^ (lts is)
        !          1937:     in
        !          1938:         init ^ (lts is) ^ fin
        !          1939:     end
        !          1940: 
        !          1941: fun member x [] = false
        !          1942:   | member x (y::l) = (x=y) orelse (member x l)
        !          1943: 
        !          1944: end
        !          1945: 
        !          1946: signature SYMBOL = sig
        !          1947: 
        !          1948: type symbol
        !          1949: 
        !          1950: val new_symbol: string -> symbol
        !          1951: val equal_symbol: symbol -> symbol -> bool
        !          1952: val tostring: symbol -> string
        !          1953: 
        !          1954: end
        !          1955: 
        !          1956: functor SymbolFun(): SYMBOL =
        !          1957: struct
        !          1958: type symbol = string
        !          1959: fun new_symbol s = s
        !          1960: fun equal_symbol s1 s2 = (s1=s2)
        !          1961: fun tostring s = s
        !          1962: end
        !          1963: 
        !          1964: signature TCONST = sig
        !          1965: 
        !          1966: type t
        !          1967: 
        !          1968: exception IllegalTConst of string
        !          1969: 
        !          1970: val from_string: string -> t
        !          1971: val tostring: t -> string
        !          1972: val le_const: t -> t -> bool
        !          1973: 
        !          1974: end
        !          1975: 
        !          1976: functor TConstFun(structure Globals:GLOBALS): TCONST = struct
        !          1977: open Globals
        !          1978: 
        !          1979: exception IllegalTConst of string
        !          1980: 
        !          1981: type t = string
        !          1982: 
        !          1983: fun tostring s = s
        !          1984: 
        !          1985: fun from_string s = if not (member s ["int", "real", "bool"])
        !          1986:                   then raise IllegalTConst(s)
        !          1987:                   else s
        !          1988: 
        !          1989: fun le_const s s' = (s=s') orelse ((s="int") andalso (s'="real"))
        !          1990: 
        !          1991: end
        !          1992: 
        !          1993: signature AST = sig
        !          1994: 
        !          1995: structure Symbol: SYMBOL
        !          1996: structure TConst: TCONST
        !          1997: 
        !          1998: type label 
        !          1999: 
        !          2000: datatype const = INTCONST of int
        !          2001:               | REALCONST of real
        !          2002:               | STRINGCONST of string
        !          2003: 
        !          2004: type id
        !          2005: type type_var
        !          2006: 
        !          2007: datatype texp = 
        !          2008:        NS
        !          2009:       | CONJ of texp * texp
        !          2010:       | ARROW of texp * texp
        !          2011:       | TYPECONST of TConst.t
        !          2012:       | OBJECT of label * texp
        !          2013:       | TVAR of type_var
        !          2014: 
        !          2015: datatype exp = 
        !          2016:        VAR of id
        !          2017:       | CONST of const
        !          2018:       | LAMBDA of id * exp
        !          2019:       | TLAMBDA of id * texp list * exp
        !          2020:       | APP of exp * exp
        !          2021:       | BUILDOBJ of label * exp
        !          2022:       | EXTRACTFIELD of exp * label
        !          2023:       | MERGE of exp * exp
        !          2024:       | BUILDSEQ of exp list
        !          2025:       | REC of exp
        !          2026:       | IF of exp * exp * exp
        !          2027:       | LETTYPE of type_var * texp
        !          2028:       | LETREC of (id * texp * exp) list * exp
        !          2029: 
        !          2030: val exptostring: exp -> string;
        !          2031: val texptostring: texp -> string;
        !          2032: 
        !          2033: end
        !          2034: 
        !          2035: functor AstFun(structure Symbol: SYMBOL
        !          2036:               structure TConst: TCONST) = struct
        !          2037: 
        !          2038: structure Symbol = Symbol
        !          2039: 
        !          2040: (* ########################################################
        !          2041: Adding the line
        !          2042:        
        !          2043:        structure TConst = TConst
        !          2044:        
        !          2045: makes the program work fine. 
        !          2046: ########################################################### *)
        !          2047: 
        !          2048: type label = Symbol.symbol
        !          2049: 
        !          2050: datatype const = INTCONST of int
        !          2051:               | REALCONST of real
        !          2052:               | STRINGCONST of string
        !          2053:            (* | ... others? *)
        !          2054: 
        !          2055: type id = Symbol.symbol
        !          2056: type type_var = Symbol.symbol
        !          2057: 
        !          2058: datatype texp = 
        !          2059:        NS
        !          2060:       | CONJ of texp * texp
        !          2061:       | ARROW of texp * texp
        !          2062:       | TYPECONST of TConst.t
        !          2063:       | OBJECT of label * texp
        !          2064:       | TVAR of type_var
        !          2065: 
        !          2066: datatype exp = 
        !          2067:        VAR of id
        !          2068:       | CONST of const
        !          2069:       | LAMBDA of id * exp
        !          2070:       | TLAMBDA of id * texp list * exp
        !          2071:       | APP of exp * exp
        !          2072:       | BUILDOBJ of label * exp
        !          2073:       | EXTRACTFIELD of exp * label
        !          2074:       | MERGE of exp * exp
        !          2075:       | BUILDSEQ of exp list
        !          2076:       | REC of exp
        !          2077:       | IF of exp * exp * exp
        !          2078:       | LETTYPE of type_var * texp
        !          2079:       | LETREC of (id * texp * exp) list * exp
        !          2080: 
        !          2081: fun exptostring e = "<exp>"
        !          2082: 
        !          2083: fun texptostring (NS) = "ns"
        !          2084:   | texptostring (ARROW(t1,t2)) = "(" ^ (texptostring t1) 
        !          2085:                                ^ "->" ^ (texptostring t2) ^ ")"
        !          2086:   | texptostring (CONJ(t1,t2)) = "(" ^ (texptostring t1) 
        !          2087:                                ^ "&" ^ (texptostring t2) ^ ")"
        !          2088:   | texptostring (OBJECT(l,t1)) = "(" ^ (Symbol.tostring l)
        !          2089:                                ^ ":" ^ (texptostring t1) ^ ")"
        !          2090:   | texptostring (TYPECONST(i)) = TConst.tostring i
        !          2091:   | texptostring (TVAR(i)) = Symbol.tostring i
        !          2092: 
        !          2093: end
        !          2094: 
        !          2095: structure Globals : GLOBALS = GlobalsFun();
        !          2096: structure TConst : TCONST = TConstFun(structure Globals=Globals);
        !          2097: structure Symbol : SYMBOL = SymbolFun();
        !          2098: (* commenting out the signature declaration on the next line results in 
        !          2099:    one additional error! *)
        !          2100: structure Ast : AST = AstFun(structure Symbol=Symbol
        !          2101:                                   structure TConst=TConst);
        !          2102: signature SUBTYPE = sig
        !          2103: 
        !          2104: structure Ast: AST
        !          2105: 
        !          2106: val le : Ast.texp -> Ast.texp -> bool
        !          2107: 
        !          2108: end (* SUBTYPE *)
        !          2109: 
        !          2110: structure Subtype : SUBTYPE = struct
        !          2111: 
        !          2112: structure Ast = Ast
        !          2113: open Ast
        !          2114: structure Globals = Globals
        !          2115: open Globals
        !          2116: 
        !          2117: fun lei(s, ts, (NS)) = true
        !          2118:   | lei(s, ts, (CONJ(t1,t2))) = lei(s, ts, t1) andalso lei(s, ts, t2)
        !          2119:   | lei(s, ts, (ARROW(t1,t2))) = lei(s, (ts@[t1]), t2)
        !          2120:   | lei((NS), ts, (t as TYPECONST(_))) = false
        !          2121:   | lei(CONJ(s1,s2), ts, (t as TYPECONST(_))) =
        !          2122:                lei(s1, ts, t) orelse lei(s2, ts, t)
        !          2123:   | lei(ARROW(s1,s2), [], (t as TYPECONST(_))) = false
        !          2124:   | lei(ARROW(s1,s2), ta::ts, (t as TYPECONST(_))) = 
        !          2125:                lei(ta, [], s1) andalso lei(s2, ts, t)
        !          2126:   | lei((TYPECONST(sc)), ta::ts, (TYPECONST(tc))) = false
        !          2127:   | lei((TYPECONST(sc)), [], (TYPECONST(tc))) = TConst.le_const sc tc
        !          2128:   | lei(s, ts, t) = raise NotImplemented ("lei " 
        !          2129:                                ^ (Ast.texptostring s) 
        !          2130:                                ^ " "
        !          2131:                                ^ (listtostring Ast.texptostring 
        !          2132:                                                "[" "," "]" ts)
        !          2133:                                ^ " "
        !          2134:                                ^ (Ast.texptostring t))
        !          2135: 
        !          2136: fun le s t = lei(s, [], t)
        !          2137: 
        !          2138: end (* SubtypeFun *)
        !          2139: 
        !          2140: Priority: A
        !          2141: --------------------------------------------------------------------------------
        !          2142: 156. confusing parser error message
        !          2143: Submitter: dbm
        !          2144: Date: 4 Nov 1989
        !          2145: Version: 0.43
        !          2146: Problem:
        !          2147:     Misspelled constructor (VALbind instead of VARbind) in line
        !          2148: 
        !          2149:          | scan ((VALbind _)::_) = ...
        !          2150: 
        !          2151:     causes inappropriate message:
        !          2152: 
        !          2153:     basics/typesutil.sml, line 74: Error: identifiers in clauses don't match
        !          2154: Priority: P
        !          2155: --------------------------------------------------------------------------------
        !          2156: 157. nested imports corrupt memory (same as 154?)
        !          2157: Submitter: sufrin%[email protected]
        !          2158: Date: 3 Nov 89
        !          2159: Version: 0.39
        !          2160: System: Sun 3
        !          2161: Problem:
        !          2162:     I have had a good deal of trouble with transitive imports. Symptom is
        !          2163:     segmentation failure on first call of a procedure defined in a functor
        !          2164:     imported transitively.
        !          2165: 
        !          2166:     parser:
        !          2167:            defines abstractsyntax, lexer, and parser functors
        !          2168: 
        !          2169:     codegen:
        !          2170:            imports parser
        !          2171:            defines code generator 
        !          2172: 
        !          2173:     main:
        !          2174:            imports codegen
        !          2175:            instantiates abstractsyntax, lexer, parser
        !          2176:            crashes at first invocation of procedure defined in parser.
        !          2177: 
        !          2178:     When I remove the "import parser" from codegen, and 
        !          2179:     import it directly from main, then all is well.
        !          2180: 
        !          2181:     This actually arose in a student's system, and I haven't time to try it in
        !          2182:     smaller contexts.  Does the symptom sound familiar? If not, I can send the
        !          2183:     whole lot to you.
        !          2184: Priority: A
        !          2185: --------------------------------------------------------------------------------
        !          2186: 160. errorty fails to match sig spec 
        !          2187: Submitter: dbm
        !          2188: Date: 18 Oct 89
        !          2189: Version: 0.43
        !          2190: System: Sun 3
        !          2191: Problem: error type not matched in checking signature spec
        !          2192: Messages:
        !          2193:     typing/functor.sml, line 363: Error: value type in structure doesn't match
        !          2194:      signature spec
        !          2195:       name: abstractBody
        !          2196:       spec: Structure * stampsets -> Structure
        !          2197:       actual: Structure * error -> Structure
        !          2198: Priority: A
        !          2199: --------------------------------------------------------------------------------
        !          2200: 162. ByteArray subscript exception expected
        !          2201: Submitter:     Jawahar Malhotra, Meta Software Corp., 
        !          2202:                        malhotra%[email protected]
        !          2203: Date:          10/17/89
        !          2204: Version:       0.33
        !          2205: System:        Sun OS 3.5
        !          2206: Problem:       ByteArray.extract doesn't raise Subscript exception when I
        !          2207:                        think it should.
        !          2208: Code:          
        !          2209:                        val ba = ByteArray.array(4,0);
        !          2210:                        
        !          2211:                        (* I feel that the following SHOULD raise an exception *)
        !          2212:                        ByteArray.extract(ba,4,0);      
        !          2213: 
        !          2214:                        (* the following two statements CORRECTLY raise exceptions *)
        !          2215: 
        !          2216:                        ByteArray.extract(ba,5,0);
        !          2217:                        ByteArray.sub(ba,4);
        !          2218: Priority: C
        !          2219: --------------------------------------------------------------------------------
        !          2220: 163. function definition syntax
        !          2221: Submitter: Andy Gordon, Cambridge University, [email protected]
        !          2222: Date: Mon Oct 16 15:26:44 1989
        !          2223: Version: Version 0.33, 1 April 1989
        !          2224: System: Sun
        !          2225: Problem: another strange function definition
        !          2226: Code:
        !          2227: fun cps-fact n k = cps-fact n k;
        !          2228: 
        !          2229: Messages:
        !          2230: Error: Compiler bug: generalizeTy -- bad arg
        !          2231:   fact : 'S -> 'T -> undef
        !          2232: 
        !          2233: Comments:
        !          2234: Like in bug 73, I was mistakenly trying to define a function whose identifier
        !          2235: contained a hyphen, but this time the compiler complains of a Compiler bug.
        !          2236: 
        !          2237: Priority: P
        !          2238: --------------------------------------------------------------------------------
        !          2239: 164. NS32 in makeml
        !          2240: Submitter: Allan E. Johannesen, wpi, [email protected]
        !          2241: Date: 13-Oct-1989
        !          2242: Version: 0.39, maybe.  That was the number in the README
        !          2243: System: Encore
        !          2244: Problem: makeml error
        !          2245: Code: makeml -encore
        !          2246: Messages: makeml: must specify machine type
        !          2247: Comments:
        !          2248: 
        !          2249: please put NS32 in $MACHINE case of makeml
        !          2250: 
        !          2251: maybe:
        !          2252: 
        !          2253:        NS32)
        !          2254:                if test "$OPSYS" != BSD
        !          2255:                then
        !          2256:                        echo "makeml: bad os ($OPSYS) for encore"
        !          2257:                        exit 1
        !          2258:                fi
        !          2259:                if test -z "$MO"
        !          2260:                then
        !          2261:                        MO="../mo.encore"
        !          2262:                fi
        !          2263:                MODULE="$MODULEKIND"Encore
        !          2264:        ;;
        !          2265: 
        !          2266: Priority: A
        !          2267: --------------------------------------------------------------------------------
        !          2268: 167. repeated bound type variables in type declaration
        !          2269: Submitter: Nick Rothwell
        !          2270: Date: 5 Oct 89
        !          2271: Version: 0.39?
        !          2272: System: Sun 3
        !          2273: Problem: multiple binding occurences of type variable accepted
        !          2274: Code:
        !          2275:         - datatype ('a, 'a, 'a) T = A of 'a | B of 'a;
        !          2276:         datatype ('a,'b,'c)  T
        !          2277:         con A : 'a -> ('a,'b,'c) T
        !          2278:         con B : 'a -> ('a,'b,'c) T
        !          2279: Priority: B
        !          2280: --------------------------------------------------------------------------------
        !          2281: 168. profiling on sparc
        !          2282: Submitter: Tom Murtagh ( [email protected])
        !          2283: Date: Oct 4, 1989
        !          2284: Version: 0.38
        !          2285: System: Sun4/SunOS 4.0.3c
        !          2286: Problem: unhandled exception Match in codegenerator when Profiling enabled
        !          2287: 
        !          2288: I stumbled across what appears to be another problem in the Sparc code
        !          2289: generator.  It seems to fail when any function is compiled with
        !          2290: profiling enabled.  This time I do have a minimal code fragment:
        !          2291: 
        !          2292: % sml
        !          2293: Standard ML of New Jersey, Version 0.38, 23 August 1989
        !          2294: val it = () : unit
        !          2295: -  System.Control.Profile.profiling := true;
        !          2296: val it = () : unit
        !          2297: - (fn x => x);
        !          2298: ?exception Match in SparcCM.storeindexl
        !          2299: uncaught exception Match
        !          2300: 
        !          2301: Status: fixed in 0.43 (?)
        !          2302: --------------------------------------------------------------------------------
        !          2303: 169. inferring eqtypes in signatures
        !          2304: Submitter: Randy Pollack <rap%[email protected]>
        !          2305: Date: Wed, 27 Sep 89
        !          2306: Problem: NJML (V0.39) is too liberal in inferring eqtypes in signatures
        !          2307: Code:
        !          2308:     - functor F() = struct abstype t = E with val mk_t = E end end;
        !          2309:     functor F : <sig>
        !          2310:     - structure f = F();
        !          2311:     structure f :
        !          2312:       sig
        !          2313:        eqtype t            (*** incorrect ***)
        !          2314:        val mk_t : t
        !          2315:       end
        !          2316: 
        !          2317:     however:
        !          2318: 
        !          2319:     - structure f = struct abstype t = E with val mk_t = E end end;
        !          2320:     structure f :
        !          2321:       sig
        !          2322:        type t              (*** correct ***)
        !          2323:        val mk_t : t
        !          2324:       end
        !          2325: Priority: A
        !          2326: --------------------------------------------------------------------------------
        !          2327: 170.  error in makeml script 
        !          2328: Submitter: sufrin%[email protected]
        !          2329: Date: Wed Sep 27
        !          2330: Transcript:
        !          2331: 26 % makeml -sun3 -ionly -o smli -m 3 
        !          2332: (cd runtime; make clean)
        !          2333: rm -f *.o lint.out prim.s linkdata allmo.s
        !          2334: rm -f mo
        !          2335: ln -s ../mo.m68 mo
        !          2336: (cd runtime; rm -f run allmo.o)
        !          2337: (cd runtime; make MACHINE=M68 linkdata)
        !          2338: cc -O  -DM68  -o linkdata linkdata.c
        !          2339: runtime/linkdata [runtime/IntNull.mos] > runtime/allmo.o
        !          2340: (cd runtime; make MACHINE=M68 'DEFS= -DSUN3 -DSUN3 -DBSD' 'CFL=-n -Bstatic -f68881' 'ASMBLR=as')
        !          2341: cc -O -n -Bstatic -f68881 -DM68 -DSUN3 -DSUN3 -DBSD  -mc68020 -c  run.c
        !          2342: cc: Warning: Obsolete option -B
        !          2343: cc -O -n -Bstatic -f68881 -DM68 -DSUN3 -DSUN3 -DBSD  -mc68020 -c  gc.c
        !          2344: cc: Warning: Obsolete option -B
        !          2345: cc -O -n -Bstatic -f68881 -DM68 -DSUN3 -DSUN3 -DBSD  -mc68020 -c  callgc.c
        !          2346: cc: Warning: Obsolete option -B
        !          2347: /lib/cpp -DM68 -DSUN3 -DSUN3 -DBSD M68.prim.s > prim.s
        !          2348: as -o prim.o prim.s
        !          2349: cc -O -n -Bstatic -f68881 -DM68 -DSUN3 -DSUN3 -DBSD  -mc68020 -c  prof.c
        !          2350: cc: Warning: Obsolete option -B
        !          2351: cc -O -n -Bstatic -f68881 -DM68 -DSUN3 -DSUN3 -DBSD  -mc68020 -c  export.c
        !          2352: cc: Warning: Obsolete option -B
        !          2353: cc -O -n -Bstatic -f68881 -DM68 -DSUN3 -DSUN3 -DBSD  -mc68020 -c  objects.c
        !          2354: cc: Warning: Obsolete option -B
        !          2355: cc -O -n -Bstatic -f68881 -DM68 -DSUN3 -DSUN3 -DBSD  -mc68020 -c  cstruct.c
        !          2356: cc: Warning: Obsolete option -B
        !          2357: cc -O -n -Bstatic -f68881 -DM68 -DSUN3 -DSUN3 -DBSD  -mc68020 -c  trace.c
        !          2358: cc: Warning: Obsolete option -B
        !          2359: cc -O -n -Bstatic -f68881 -DM68 -DSUN3 -DSUN3 -DBSD -o run run.o gc.o callgc.o prim.o prof.o export.o objects.o cstruct.o trace.o allmo.o
        !          2360: cc: Warning: Obsolete option -B
        !          2361: _Loader: ld: allmo.o: multiply defined
        !          2362: *** Error code 2
        !          2363: make: Fatal error: Command failed for target `run'
        !          2364: echo (System.Control.interp := true; exportML "smli"; output std_out System.version; output std_out "\n"); | runtime/run -m 3 -r 20 -h 2048 IntNull
        !          2365: makeml: runtime/run: cannot execute
        !          2366: 
        !          2367: Priority: A
        !          2368: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.