|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.