[svn] r6270: nemerle/trunk/ncc: hierarchy/TypeBuilder.n testsuite/negative/void-parm2.n testsuite/positive...

malekith svnadmin at nemerle.org
Sun May 14 15:08:21 CEST 2006


Log:
Immediatly save error after void is unified with S.Object. Accomodate for that change elsewhere. Resolves #674.

Author: malekith
Date: Sun May 14 15:08:20 2006
New Revision: 6270

Modified:
   nemerle/trunk/ncc/hierarchy/TypeBuilder.n
   nemerle/trunk/ncc/testsuite/negative/void-parm2.n
   nemerle/trunk/ncc/testsuite/positive/delegate.n
   nemerle/trunk/ncc/typing/MType.n
   nemerle/trunk/ncc/typing/Subst.n
   nemerle/trunk/ncc/typing/TyVar.n
   nemerle/trunk/ncc/typing/Typer-CallTyper.n
   nemerle/trunk/ncc/typing/Typer.n

Modified: nemerle/trunk/ncc/hierarchy/TypeBuilder.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/TypeBuilder.n	(original)
+++ nemerle/trunk/ncc/hierarchy/TypeBuilder.n	Sun May 14 15:08:20 2006
@@ -881,11 +881,10 @@
 
         when (check_parms)
           List.Iter2 (typarms, args, fun (tp : StaticTyVar, val : TyVar) {
-            unless (val.Require (res.Apply (tp.LowerBound))) {
-              if (val.Fix () is MType.Void)
+            when (val.Equals (InternalType.Void))
                 ReportError (messenger,
                              $ "cannot use `void' as a generic parameter of $tc");
-              else
+            unless (val.Require (res.Apply (tp.LowerBound))) {
                 ReportError (messenger,
                              $ "typing constraint on $(tp.Name) not satisfied, "
                                "upon instantiation of $tc");

Modified: nemerle/trunk/ncc/testsuite/negative/void-parm2.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/negative/void-parm2.n	(original)
+++ nemerle/trunk/ncc/testsuite/negative/void-parm2.n	Sun May 14 15:08:20 2006
@@ -1,7 +1,7 @@
 module M {
   public Main () : void // OK
   {
-    [()].Iter ( // E: cannot use `void' as a generic parameter of Nemerle.Core.list
+    [()].Iter ( // E: void is not a subtype of System.Object
       fun (_) {
       }
     );
@@ -10,7 +10,9 @@
     def f (_)
       {}
 
-    [1,2].Map (f).ToString (" ") // E: cannot use `void' as a generic parameter of Nemerle.Core.list
+    [1,2].Map (f).ToString (" "); // E: cannot use `void' as a generic parameter of Nemerle.Core.list
 
+    mutable q = 7;
+    System.Console.WriteLine ("{0}", q++); // E: void is not a subtype of System.Object
   }
 }

Modified: nemerle/trunk/ncc/testsuite/positive/delegate.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/delegate.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/delegate.n	Sun May 14 15:08:20 2006
@@ -1,3 +1,4 @@
+using System;
 using Nemerle.IO;
 
 delegate Foo () : void;
@@ -21,7 +22,6 @@
 // Test for covariance support in delegates
 //
 
-using System;
 
  public class A {
          protected  mutable  name : string;
@@ -165,6 +165,25 @@
 
 public delegate GenDel[X] (x : X) : int;
 
+namespace Bug674 {
+delegate fn[T] () : T;
+delegate fn[R,T] (_:R) : T;
+delegate fn[R,S,T] (_:R,_:S) : T;
+
+module X {
+  public wh[T](_predicate : fn[T, int, bool]) : void
+    {  }
+  public wh[T](_predicate : fn[T, bool]) : void
+    {  }
+
+  public foobar () : void
+  {
+    X.wh (x => x % 2 == 0);
+  }
+}
+}
+
+
 public module M {
 
   public delegate MyPrintDelegate (s : string) : void;

Modified: nemerle/trunk/ncc/typing/MType.n
==============================================================================
--- nemerle/trunk/ncc/typing/MType.n	(original)
+++ nemerle/trunk/ncc/typing/MType.n	Sun May 14 15:08:20 2006
@@ -252,7 +252,10 @@
       def s = Passes.Solver;
 
       match ((this, t)) {
-        | (Void, Class) => false
+        | (Void, Class) =>
+          SaveError (s.CurrentMessenger, 
+                     $ "$(this) is not a subtype of $t");
+          false
 
         | (_, Class (tc, _)) 
           when tc.Equals (InternalType.Object_tc) => true
@@ -308,7 +311,10 @@
         | (Array, Class (_, []) as ct) =>
           InternalType.Array.Require (ct)
 
-        | (Array, _) => false
+        | (Array, _) =>
+          SaveError (s.CurrentMessenger, 
+                     $ "$(this) is not a subtype of $t");
+          false
 
         | (TyVarRef (tv1), TyVarRef (tv2))
           when tv1.Equals (tv2) => true

Modified: nemerle/trunk/ncc/typing/Subst.n
==============================================================================
--- nemerle/trunk/ncc/typing/Subst.n	(original)
+++ nemerle/trunk/ncc/typing/Subst.n	Sun May 14 15:08:20 2006
@@ -206,8 +206,10 @@
           });
 
         List.Iter2 (vars, vars', fun (v : StaticTyVar, tv : TyVar) {
+          when (!v.LowerBound.Equals (InternalType.Object)) {
           def ok = tv.Require (res.Apply (v.LowerBound));
           Util.cassert (was_error || ok, $ "req fail, $tv $(res.Apply (v.LowerBound))");
+          }
         });
         (res, vars')
       }

Modified: nemerle/trunk/ncc/typing/TyVar.n
==============================================================================
--- nemerle/trunk/ncc/typing/TyVar.n	(original)
+++ nemerle/trunk/ncc/typing/TyVar.n	Sun May 14 15:08:20 2006
@@ -34,7 +34,7 @@
 
 using Nemerle.Compiler.SolverMacros;
 
-//#define VERB
+// #define VERB
 
 #if VERB
 [assembly: LogFlag (SOLVER, true)]
@@ -695,7 +695,7 @@
       WillWrite ();
       assert (Self : object == this);
 
-      log (SOLVER, $ "Alias: $(this) ---> $tv");
+      log (SOLVER, $ "Alias: $(this) ---> $tv, fresh=$(IsFresh)");
 
       if (tv.Self : object != this) {
         if (IsFromNull && !tv.CanBeNull) {
@@ -865,7 +865,7 @@
           else {
             high.WillWrite ();
             whenlogging (SOLVER) {
-              def tv = if (high.lower_bound == null) "(null)" else high.lower_bound.ToString ();
+              //def tv = if (high.lower_bound == null) "(null)" else high.lower_bound.ToString ();
               //Message.Debug ($"new bound $tv * $low  = $new_bound");
             }
             when (high.lower_bound == null || 

Modified: nemerle/trunk/ncc/typing/Typer-CallTyper.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer-CallTyper.n	(original)
+++ nemerle/trunk/ncc/typing/Typer-CallTyper.n	Sun May 14 15:08:20 2006
@@ -283,8 +283,7 @@
                              "$(fparm.kind) parameter, got $(aparm.kind)")
             
           | x =>
-            Message.Warning ("oops");
-            assert (false, x.ToString ())
+            Util.ice (x.ToString ())
         }
 
         loop (header.parms, formals_types, call_parms)
@@ -331,7 +330,7 @@
         else
           LoopWithHeader ();
 
-        log (TYPING, $"end parm loop $imethod, res=$result_type");
+        log (TYPING, $"end parm loop $imethod, res=$result_type localerr=$(messenger.LocalError)");
 
         unless (messenger.LocalError) {
           _ = typer.Expect (expected_type, result_type, "call result");

Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n	(original)
+++ nemerle/trunk/ncc/typing/Typer.n	Sun May 14 15:08:20 2006
@@ -893,6 +893,7 @@
             else null;
 
           if (del_tc != null) {
+            log (TYPING, $ "delegate conversion, $(expr.Type) ---> $del_tc");
             def name = Util.ExprOfQid (del_tc.FullName);
             def expr = TryTyping (fun () {
               TypeExpr (<[ $name ($(expr : typed)) ]>)
@@ -904,6 +905,7 @@
               expr
             }
           } else if (SubtypingOrImplicitConv (expr.Type, target, out meth)) {
+            log (TYPING, $ "got subtyping, $(expr.Type) ---> $target, meth=$meth");
             if (meth == null)
               expr
             else
@@ -924,6 +926,7 @@
           } else if (target.Hint is Some (Fun) && 
                      expr.Type.Hint is Some (Fun) &&
                      expr.Type.Fix ().TrySigRequire (target.Fix ())) {
+            log (TYPING, $ "function subtyping, $(expr.Type) ---> $target, meth=$meth");
             def target = target.Fix ();
             _ = expr.Type.FixedValue.SigRequire (target);
             def srctypes = Option.UnSome (target.FunReturnTypeAndParms ()) [0];



More information about the svn mailing list