[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