[ nice-Bugs-1216727 ] Compiler crash with wildcards
"SourceForge.net" <[email protected]> Wed, 08 Jun 2005 03:08:40 -0700
| Newsgroups | gmane.comp.lang.nice.devel |
|---|---|
| Message-ID | <[email protected]> |
Bugs item #1216727, was opened at 2005-06-07 23:53
Message generated for change (Comment added) made by bonniot
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=112788&aid=1216727&group_id=12788
Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: None
Group: None
Status: Open
Resolution: None
Priority: 5
Submitted By: Bryn Keller (xoltar)
>Assigned to: Daniel Bonniot (bonniot)
Summary: Compiler crash with wildcards
Initial Comment:
C:\>nicec --version
Nice compiler version 0.9.11 (build 2005.06.07,
10:52:36 UTC)
Compiled using JDK 1.4.2
Copyright (C) 2003 Daniel Bonniot
Visit the Nice homepage: http://nice.sourceforge.net
This code:
interface FList<T> {
boolean isEmpty();
}
abstract class ConsList<T> finally implements FList<T> {}
class Cons<T> extends ConsList<T>
{
T head;
ConsList<T> tail;
isEmpty() = false;
}
class Nil<T> extends ConsList<T>
{
isEmpty() = true;
}
/** The singleton. */
private let Nil<?> NIL = new Nil();
/** Returns the Nil singleton. */
ConsList<?> nil() = NIL;
/** Returns a new cons cell. */
<T> ConsList<T> cons(T item, ConsList<T> tail) =
new Cons(head: item, tail: tail);
void _testEmpty()
{
assert nil().isEmpty;
assert !cons(1,nil()).isEmpty;
}
produces this crash:
An exception has occured in the compiler
Please fill-in a bug report at the following webpage:
http://sourceforge.net/tracker/?func=add&group_id=12788&atid=112788
Stack trace:
Exception in thread "main" mlsub.typing.InternalError:
Simplifying ill-formed po
lytype: <T | scratch.ConsList<?> <:
scratch.ConsList<T>, nice.lang.byte <: T> (T
, scratch.ConsList<T>)
at
mlsub.typing.Polytype.simplify(Polytype.java:286)
at bossa.syntax.fun.setComputedType(call.nice:102)
at bossa.syntax.CallExp.setComputedType(call.nice)
at
bossa.syntax.fun.resolveOverloading(overloadedsymbol.nice:161)
at
bossa.syntax.dispatch.resolveOverloading(Unknown Source)
at
bossa.syntax.fun.resolveOverloading(call.nice:54)
at
bossa.syntax.CallExp.resolveOverloading(call.nice)
at bossa.syntax.fun.computeType(call.nice:69)
at bossa.syntax.CallExp.computeType(call.nice)
at
bossa.syntax.Expression.getType(Expression.java:109)
at bossa.syntax.fun.typecheck(typecheck.nice:242)
at bossa.syntax.dispatch.typecheck(Unknown Source)
at
bossa.syntax.fun.typecheckArgs(typecheck.nice:124)
at
bossa.syntax.Arguments.typecheckArgs(arguments.nice)
at bossa.syntax.fun.typecheck(typecheck.nice:221)
at bossa.syntax.dispatch.typecheck(Unknown Source)
at
bossa.syntax.fun.typecheckArgs(typecheck.nice:124)
at
bossa.syntax.Arguments.typecheckArgs(arguments.nice)
at bossa.syntax.fun.typecheck(typecheck.nice:221)
at bossa.syntax.dispatch.typecheck(Unknown Source)
at
bossa.syntax.fun.typecheckArgs(typecheck.nice:124)
at
bossa.syntax.Arguments.typecheckArgs(arguments.nice)
at bossa.syntax.fun.typecheck(typecheck.nice:221)
at bossa.syntax.dispatch.typecheck(Unknown Source)
at bossa.syntax.fun.typecheck(typecheck.nice:891)
at bossa.syntax.dispatch.typecheck(Unknown Source)
at bossa.syntax.fun.lambda77(typecheck.nice:805)
at bossa.syntax.fun.apply1(Unknown Source)
at
gnu.expr.ModuleMethod.apply1(ModuleMethod.java:89)
at nice.lang.fun.foreach(collections.nice:141)
at nice.lang.dispatch.foreach(Unknown Source)
at bossa.syntax.fun.typecheck(typecheck.nice:803)
at bossa.syntax.dispatch.typecheck(Unknown Source)
at
bossa.syntax.fun.innerTypecheck(defaultMethod.nice:100)
at
bossa.syntax.DefaultMethodImplementation.innerTypecheck(defaultMethod
.nice)
at
bossa.syntax.fun.innerTypecheck(defaultMethod.nice:28)
at
bossa.syntax.MethodDeclaration.innerTypecheck(methodDeclaration.nice)
at
bossa.syntax.fun.typecheck(methodDeclaration.nice:161)
at
bossa.syntax.MethodDeclaration.typecheck(methodDeclaration.nice)
at bossa.syntax.Node.doTypecheck(Node.java:299)
at bossa.syntax.Node.doTypecheck(Node.java:304)
at bossa.syntax.Node.doTypecheck(Node.java:304)
at bossa.syntax.fun.typechecking(call.nice:186)
at bossa.syntax.CAST.typechecking(ast.nice)
at
bossa.modules.Package.typecheck(Package.java:369)
at mlsub.compilation.fun.lambda31(Unknown Source)
at mlsub.compilation.fun.apply1(Unknown Source)
at
gnu.expr.ModuleMethod.apply1(ModuleMethod.java:89)
at nice.lang.fun.foreach(collections.nice:141)
at nice.lang.dispatch.foreach(Unknown Source)
at
mlsub.compilation.fun.compileComponent(make.nice:29)
at
mlsub.compilation.dispatch.compileComponent(Unknown Source)
at mlsub.compilation.fun$make.lambda30(Unknown
Source)
at mlsub.compilation.fun$make.apply1(Unknown
Source)
at
gnu.expr.ModuleMethod.apply1(ModuleMethod.java:89)
at nice.lang.fun.foreach(collections.nice:141)
at nice.lang.dispatch.foreach(Unknown Source)
at mlsub.compilation.fun.make(make.nice:44)
at mlsub.compilation.dispatch.make(Unknown Source)
at
nice.tools.compiler.fun.compile(interface.nice:40)
at nice.tools.compiler.dispatch.compile(Unknown
Source)
at
nice.tools.compiler.console.fun.compile(main.nice:165)
at
nice.tools.compiler.console.dispatch.compile(Unknown
Source)
at
nice.tools.compiler.console.fun.main(main.nice:199)
at
nice.tools.compiler.console.dispatch.main(Unknown Source)
----------------------------------------------------------------------
>Comment By: Daniel Bonniot (bonniot)
Date: 2005-06-08 12:08
Message:
Logged In: YES
user_id=88952
As a consequence of ? being existential ("some type", not
"any type"), the call cons(1,nil()) is ill-typed. This
should of course be reported nicely, not with a crash!
Simplified testcase:
class Cons<T> {
T head;
Cons<T> tail;
boolean isEmpty() = false;
}
void _testEmpty(Cons<?> c)
{
assert !new Cons(head: 1, tail: c).isEmpty;
}
----------------------------------------------------------------------
Comment By: Daniel Bonniot (bonniot)
Date: 2005-06-08 00:13
Message:
Logged In: YES
user_id=88952
Thanks for the report, I'll investigate that tomorrow. But
note that
ConsList<?> nil()
is probably not what you want, since it has an unknown
(existential) type parameter, so you cannot use it with any
specific expected type parameter. That is, ConsList<String>
l = nil() should then fail. You rather want
<T> ConsList<T> nil()
(If FList is supposed to be immutable, you can also make it
covariant, but that's irrelevant here)
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=112788&aid=1216727&group_id=12788
-------------------------------------------------------
This SF.Net email is sponsored by: NEC IT Guy Games. How far can you shotput
a projector? How fast can you ride your desk chair down the office luge track?
If you want to score the big prize, get to know the little guy.
Play to win an NEC 61" plasma display: http://www.necitguy.com/?r=20