ICE на ровном месте
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 04.12.07 15:49
Оценка:
Собственно, вот он (компилятор из ноябрьской интеграции):

Target CoreCompile:
    c:\Program Files\Nemerle\ncc.exe /no-color /no-stdlib /define:DEBUG;TRACE /debug+ /out:obj\Debug\Terminus.Core.dll /target:library Properties\AssemblyInfo.n Seq.n Set.n ISetReader.n Utils.n /ref:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll /ref:"c:\Program Files\Nemerle\\Nemerle.dll" /ref:"C:\Program Files\Nemerle\Nemerle.Macros.dll" /ref:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /ref:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /ref:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll
    c:\Program Files\Nemerle\Nemerle.MSBuild.targets(173,9): error : internal compiler error: got some unknown exception of type System.NullReferenceException: Object reference not set to an instance of an object.
       at Nemerle.Compiler.TyVarEnv.bind_simple_named_type(GlobalEnv env, TypeBuilder curtc, Name name, list`1 idl, list`1 args)
       at Nemerle.Compiler.TyVarEnv._N_type_class99328(_N_closure99293 _N_Bind_cp99327, PExpr tyexpr)
       at Nemerle.Compiler.TyVarEnv._N_f299322(_N_closure99293 _N_Bind_cp99321, PExpr t, Boolean allow_ref)
       at Nemerle.Compiler.TyVarEnv._N_f_99313.apply(PExpr _N_99312)
       at Nemerle.Compiler.TyVarEnv.Bind(GlobalEnv env, TypeBuilder curtc, PExpr t, Boolean allow_tyvars, Boolean check_parms)
       at Nemerle.Compiler.Typer.DoType(PExpr expression, TyVar expected, Boolean is_toplevel_in_seq)
       at Nemerle.Compiler.Typer.TypeExpr(PExpr expr, TyVar expected, Boolean is_toplevel_in_seq)
       at Nemerle.Compiler.Typer.TypeLocalDefinition(Boolean is_mutable, Name name, PExpr val)
       at Nemerle.Compiler.Typer.DoType(PExpr expression, TyVar expected, Boolean is_toplevel_in_seq)
       at Nemerle.Compiler.Typer.TypeExpr(PExpr expr, TyVar expected, Boolean is_toplevel_in_seq)
       at Nemerle.Compiler.Typer.DoType(PExpr expression, TyVar expected, Boolean is_toplevel_in_seq)
       at Nemerle.Compiler.Typer.TypeExpr(PExpr expr, TyVar expected, Boolean is_toplevel_in_seq)
       at Nemerle.Compiler.Typer.TypeMatch(Match mtch, TyVar expected)
       at Nemerle.Compiler.Typer.DoType(PExpr expression, TyVar expected, Boolean is_toplevel_in_seq)
       at Nemerle.Compiler.Typer.TypeExpr(PExpr expr, TyVar expected, Boolean is_toplevel_in_seq)
       at Nemerle.Compiler.Typer.TypeExpr(PExpr expr, TyVar expected, Boolean is_toplevel_in_seq)
       at Nemerle.Compiler.Typer.DoType(PExpr expression, TyVar expected, Boolean is_toplevel_in_seq)
       at Nemerle.Compiler.Typer.TypeExpr(PExpr expr, TyVar expected, Boolean is_toplevel_in_seq)
       at Nemerle.Compiler.Typer.RunTyper()
       at Nemerle.Compiler.Typer.RunFullTyping()
       at Nemerle.Compiler.MethodBuilder.RunBodyTyper()
       at Nemerle.Compiler.MethodBuilder.Compile()
       at Nemerle.Compiler.TypeBuilder.EmitImplementation()
       at Nemerle.Compiler.TypesManager._N_emit_impl_36366.apply_void(TypeBuilder _N_36365)
       at Nemerle.Compiler.TypesManager._N_maybe_f_36973.apply_void(TypeBuilder _N_36972)
       at Nemerle.Collections.List.Iter['a](list`1 l, FunctionVoid`1 f)
       at Nemerle.Core.list`1.Iter(FunctionVoid`1 f)
       at Nemerle.Compiler.TypesManager.Iter(list`1 builders, FunctionVoid`1 f)
       at Nemerle.Compiler.TypesManager.compile_all_tyinfos(Boolean aux_phase)
       at Nemerle.Compiler.TypesManager._N__N_l35778_35881.apply_void()
       at Nemerle.Compiler.Solver.Enqueue(FunctionVoid action)
       at Nemerle.Compiler.TypesManager.EmitDecls()
       at Nemerle.Compiler.ManagerClass.Run()
       at Nemerle.CommandlineCompiler.MainClass.main_with_catching()


Приведу исх. файл c сокращениями (другие для понимания сути ICE не нужны):

using System;
using System.Text;
using SCG = System.Collections.Generic;


namespace Terminus.Core
{
    public class Set['a] : ISetReader['a]
    {
      variant Tree
      {
        | Node { mutable height : int; data : list['a]; hash : int; left : Tree; right : Tree; }
        | Null
        
        public Height : int
        {
          get
          {
            match (this)
            {
              | Node(_, _, _, l, r) as node =>
                when (node.height == 0)
                  node.height = Math.Max(l.Height, r.Height) + 1;
                node.height
              | Tree.Null => 1
            }
          }
        }
      }
      
      public static Empty : Set['a] = Set.['a](Tree.Null());
      tree : Tree;
      mutable count = -1;
      
      this(tree : Tree)
      {
        this.tree = tree;
      }
      
      [skip]
      
      // Вот этот метод, судя по всему, вызывает ICE
      static MakeTree(data : list['a], hash : int, left : Tree, right : Tree) : Tree
      {
        if (left.Height + 1 < right.Height)
        {
          def rightNode = right :> Tree.Node;
          Tree.Node(
            0, rightNode.data, rightNode.hash,
            Tree.Node(0, data, hash, left, rightNode.left),
            rightNode.right)
        }
        else if (right.Height + 1 < left.Height)
        {
          def leftNode = left :> Tree.Node;
          Tree.Node(
            0, leftNode.data, leftNode.hash,
            leftNode.left,
            Tree.Node(0, data, hash, leftNode.left, right))
        }
        else
          Tree.Node(0, data, hash, left, right)
      }
      
      [skip]
    }
}


Такой же ICE вылетает и в сентябрьской интеграции. Более старые не пробовал. Компилить ncc вручную и разбираться тоже не пытался — времени нету.

PS: непонятно, как это в Nemerle с его option могут быть проблемы с NRE. Может, MS с его null, must die?
... << RSDN@Home 1.2.0 alpha rev. 710>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.