[nem-bug] [Nemerle 0000921]: Type inference fails due to ICE
feedback at nemerle.org
feedback at nemerle.org
Mon Jul 9 18:37:56 CEST 2007
A NOTE has been added to this issue.
======================================================================
<http://nemerle.org/bugs/view.php?id=921>
======================================================================
Reported By: nikov
Assigned To:
======================================================================
Project: Nemerle
Issue ID: 921
Category: Compiler
Reproducibility: always
Severity: major
Priority: normal
Status: new
======================================================================
Date Submitted: 02-20-2007 12:28 CET
Last Modified: 07-09-2007 18:37 CEST
======================================================================
Summary: Type inference fails due to ICE
Description:
[nemerle]
using System;
using System.Console;
using Nemerle.Utility;
module Program
{
Main() : void
{
def power(f, n) {
match(n) {
| 0 => (x => x)
| 1 => f
| _ => (x => f(power(f, n - 1)(x)))
}
}
def g(k) { k + 1 }
def i = power(g, 5)(3);
WriteLine(i);
_ = ReadKey();
}
}
[/nemerle]
[output]
C:\Program Files\Nemerle\Nemerle.MSBuild.targets(167,9):Error: types ? ->
? and ? -> ? are not compatible [during intersection]
C:\Program Files\Nemerle\Nemerle.MSBuild.targets(167,9):Error: internal
compiler error: assertion ''res'' failed in file ncc\typing\TyVar.n, line
392:
failed to fixate ? -> ? [] with ? -> ?
at Nemerle.Compiler.TyVar._N__FT_Fixate_2140() in
C:\Nemerle\ncc\typing\TyVar.n:line 392
at Nemerle.Compiler.TyVar.Fixate() in
C:\Nemerle\ncc\typing\TyVar.n:line 368
at Nemerle.Compiler.TyVar.Fix() in C:\Nemerle\ncc\typing\TyVar.n:line
301
at Nemerle.Compiler.Typer.NonLiteralCast(TExpr expr, TyVar target) in
C:\Nemerle\ncc\typing\Typer.n:line 953
at Nemerle.Compiler.Typer.TryAddCastTo(TExpr expr, TyVar target) in
C:\Nemerle\ncc\typing\Typer.n:line 997
at Nemerle.Compiler.Typer.AddCastTo(TExpr expr, TyVar target, String
place) in C:\Nemerle\ncc\typing\Typer.n:line 852
at Nemerle.Compiler.Typer.RunTyper() in
C:\Nemerle\ncc\typing\Typer.n:line 342
at Nemerle.Compiler.Typer..ctor(Typer parent, Fun_header fn) in
C:\Nemerle\ncc\typing\Typer.n:line 253
at Nemerle.Compiler.CompilerComponentsFactory.CreateTyper(Typer
parent, Fun_header fn) in C:\Nemerle\ncc\misc\ComponentsFactory.n:line 33
at Nemerle.Compiler.Typer.TypeLocalFunction(list`1 functions) in
C:\Nemerle\ncc\typing\Typer.n:line 1862
at Nemerle.Compiler.Typer.DoType(PExpr expression, TyVar expected,
Boolean is_toplevel_in_seq) in C:\Nemerle\ncc\typing\Typer.n:line 1246
at Nemerle.Compiler.Typer.TypeExpr(PExpr e, TyVar expected, Boolean
is_toplevel_in_seq) in C:\Nemerle\ncc\typing\Typer.n:line 1070
at Nemerle.Compiler.Typer.DoType(PExpr expression, TyVar expected,
Boolean is_toplevel_in_seq) in C:\Nemerle\ncc\typing\Typer.n:line 1627
at Nemerle.Compiler.Typer.TypeExpr(PExpr e, TyVar expected, Boolean
is_toplevel_in_seq) in C:\Nemerle\ncc\typing\Typer.n:line 1070
at Nemerle.Compiler.Typer.TypeExpr(PExpr e, TyVar expected) in
C:\Nemerle\ncc\typing\Typer.n:line 1048
at Nemerle.Compiler.Typer.TypeExpr(PExpr e) in
C:\Nemerle\ncc\typing\Typer.n:line 1042
at Nemerle.Compiler.Typer.RunTyper() in
C:\Nemerle\ncc\typing\Typer.n:line 340
at Nemerle.Compiler.Typer..ctor(MethodBuilder m) in
C:\Nemerle\ncc\typing\Typer.n:line 175
at
Nemerle.Compiler.CompilerComponentsFactory.CreateTyper(MethodBuilder m) in
C:\Nemerle\ncc\misc\ComponentsFactory.n:line 33
at Nemerle.Compiler.MethodBuilder.RunBodyTyper() in
C:\Nemerle\ncc\hierarchy\ClassMembers.n:line 811
at Nemerle.Compiler.MethodBuilder.Compile() in
C:\Nemerle\ncc\generation\HierarchyEmitter.n:line 972
at Nemerle.Compiler.TypeBuilder.EmitImplementation() in
C:\Nemerle\ncc\generation\HierarchyEmitter.n:line 564
at
Nemerle.Compiler.TypesManager._N_emit_impl_36087.apply_void(TypeBuilder
_N_36086) in C:\Nemerle\ncc\generation\HierarchyEmitter.n:line 316
at
Nemerle.Compiler.TypesManager._N_maybe_f_36693.apply_void(TypeBuilder
_N_36692) in C:\Nemerle\ncc\hierarchy\TypesManager.n:line 225
at Nemerle.Collections.List.Iter['a](list`1 l, FunctionVoid`1 f) in
C:\Nemerle\lib\list.n:line 906
at Nemerle.Core.list`1.Iter(FunctionVoid`1 f) in
C:\Nemerle\lib\list.n:line 307
at Nemerle.Compiler.TypesManager.Iter(list`1 builders, FunctionVoid`1
f) in C:\Nemerle\ncc\hierarchy\TypesManager.n:line 231
at Nemerle.Compiler.TypesManager.Iter(FunctionVoid`1 f) in
C:\Nemerle\ncc\hierarchy\TypesManager.n:line 242
at Nemerle.Compiler.TypesManager.compile_all_tyinfos(Boolean
aux_phase) in C:\Nemerle\ncc\generation\HierarchyEmitter.n:line 340
at Nemerle.Compiler.TypesManager._N__N_l35520_35623.apply_void() in
C:\Nemerle\ncc\generation\HierarchyEmitter.n:line 205
at Nemerle.Compiler.Solver.Enqueue(FunctionVoid action) in
C:\Nemerle\ncc\typing\Solver.n:line 197
at Nemerle.Compiler.TypesManager.EmitDecls() in
C:\Nemerle\ncc\generation\HierarchyEmitter.n:line 204
at Nemerle.Compiler.ManagerClass.Run() in
C:\Nemerle\ncc\passes.n:line 432
at Nemerle.CommandlineCompiler.MainClass.main_with_catching() in
C:\Nemerle\ncc\main.n:line 86
Done building project "NemerleApplication4.nproj" -- FAILED.
[/output]
======================================================================
----------------------------------------------------------------------
nikov - 02-20-07 12:36
----------------------------------------------------------------------
Minor hint helps.
def power(f : _ -> _, n) {
or
| 1 => f(_)
Nevertheless, should work without a hint.
----------------------------------------------------------------------
nikov - 02-20-07 12:56
----------------------------------------------------------------------
Well, now I see that branch
| 1 => f
is redundant. But I still does not understand, why it breaks inference...
----------------------------------------------------------------------
divan - 07-04-07 21:04
----------------------------------------------------------------------
There is no inheritance for functions. (or is there?)
So maybe just in Solver.Intersect add one more case:
| (MType.Fun (p1, r1), MType.Fun (p2, r2)) =>
_ = p1.Unify (p2);
_ = r1.Unify (r2);
[MType.Fun (p1, r1)]
At least on this example it works :)
----------------------------------------------------------------------
malekith - 07-09-07 18:37
----------------------------------------------------------------------
This should be fine. We do not support subtyping of function types, there
is only an implicit conversion.
We once did support it, and this is probably why we didn't have this case
in Intersect in the first place.
Issue History
Date Modified Username Field Change
======================================================================
02-20-07 12:28 nikov New Issue
02-20-07 12:36 nikov Note Added: 0001759
02-20-07 12:56 nikov Note Added: 0001760
06-28-07 23:12 divan Issue Monitored: divan
07-04-07 21:04 divan Note Added: 0001933
07-09-07 18:37 malekith Note Added: 0001937
======================================================================
More information about the bugs
mailing list