[svn] r7819: nemerle/trunk/ncc: testsuite/negative/block2.n testsuite/negative/block3.n testsuite/positive...

divan svnadmin at nemerle.org
Sat Oct 20 19:02:30 CEST 2007


Log:
Fix bug 1040:
1) block(2) is int->void call, as it breaks flow
2) block return isn't allowed in assignment source
3) see tests for implied changes

Author: divan
Date: Sat Oct 20 19:02:26 2007
New Revision: 7819

Added:
   nemerle/trunk/ncc/testsuite/negative/block3.n   (contents, props changed)
Modified:
   nemerle/trunk/ncc/testsuite/negative/block2.n
   nemerle/trunk/ncc/testsuite/positive/block.n
   nemerle/trunk/ncc/testsuite/positive/extension-methods.n
   nemerle/trunk/ncc/testsuite/positive/imperative.n
   nemerle/trunk/ncc/typing/Typer.n
   nemerle/trunk/ncc/typing/Typer2.n

Modified: nemerle/trunk/ncc/testsuite/negative/block2.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/negative/block2.n	(original)
+++ nemerle/trunk/ncc/testsuite/negative/block2.n	Sat Oct 20 19:02:26 2007
@@ -5,8 +5,9 @@
       def qfoo () {
         brk (42) // E: non local goto
       }
-      qfoo(); // W: ignored
       qfoo();
+      qfoo();
+      1
     }
   }
 

Added: nemerle/trunk/ncc/testsuite/negative/block3.n
==============================================================================
--- (empty file)
+++ nemerle/trunk/ncc/testsuite/negative/block3.n	Sat Oct 20 19:02:26 2007
@@ -0,0 +1,24 @@
+public class Bug1040
+{
+    private static F(x : int, z : ref int) : int
+    {
+        result:
+        {
+            z = match(x)
+            {
+                | 0 =>
+                    result(5); // E: goto
+                    x
+                | _ =>
+                    x
+            }
+            F(x-1, ref z)
+        }
+    }
+
+    public static Main(_ : array[string]) : void
+    {
+        mutable z;
+        System.Console.WriteLine(F(2, ref z).ToString())
+    }
+}
\ No newline at end of file

Modified: nemerle/trunk/ncc/testsuite/positive/block.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/block.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/block.n	Sat Oct 20 19:02:26 2007
@@ -30,7 +30,7 @@
         when (tmp == 42)
           brk(42);
       }
-      brk(x)
+      x
     }
   }
 
@@ -104,7 +104,9 @@
   {
     ret : {
       try {
-        ret (42);
+        when (true)
+          ret(42);
+        24
       } finally {
         Nemerle.IO.print ("must be finally\n");
       }
@@ -153,7 +155,7 @@
             ret (res.Filter (fun (mem) {
               ! (mem == 3)
             }));
-        ret (res)
+        res
       }
     System.Console.WriteLine (res);
 
@@ -180,7 +182,7 @@
         qux : { 
           when (x)
             qux (1);
-          qux (2)
+          2
         }
       }
 
@@ -188,7 +190,9 @@
       def foo4 () : int * int
       {
         res : {
-          res (1, 2)
+          when (true)
+            res (1, 2);
+          (2, 1)
         }
       }
 

Modified: nemerle/trunk/ncc/testsuite/positive/extension-methods.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/extension-methods.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/extension-methods.n	Sat Oct 20 19:02:26 2007
@@ -90,7 +90,7 @@
             foreach (o in objs)
                 when (!fn (o))
                     return (false)
-            return (true)
+            true
 
 def ls = $ [0, 2 .. 10] : System.Collections.Generic.IEnumerable [int]
 

Modified: nemerle/trunk/ncc/testsuite/positive/imperative.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/imperative.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/imperative.n	Sat Oct 20 19:02:26 2007
@@ -17,7 +17,7 @@
     public to_string (x : bool) : string {
       when (x) return ("a");
       Nemerle.IO.print ("$x\n");
-      return "b";
+      "b"
     }
   }
 

Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n	(original)
+++ nemerle/trunk/ncc/typing/Typer.n	Sat Oct 20 19:02:26 2007
@@ -2775,14 +2775,14 @@
               //Message.Debug ($"local fun ref: $typarms $fnty");
               result = TExpr.LocalFunRef (expected, local, typarms);
             
-            // for block of type 'a, block exit is forall 'b. 'a -> 'b
+            // for block of type 'a, block exit is 'a -> void
             | LocalValue.Kind.BlockReturn =>
               when (!allow_block_return)
                 ReportError (messenger,
                              $ "block-return expression `$(local.Name)' "
                                "needs to be followed by (...)");
               local.EverUsed = true;
-              ty = MType.Fun (local.Type, FreshTyVar ());
+              ty = MType.Fun (local.Type, InternalType.Void);
               
             | _ => ty = local.Type
           }

Modified: nemerle/trunk/ncc/typing/Typer2.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer2.n	(original)
+++ nemerle/trunk/ncc/typing/Typer2.n	Sat Oct 20 19:02:26 2007
@@ -1178,8 +1178,14 @@
 
             def target = Walk (Context.NeedLValue, target);
             def src_ctx =
-              if (target is TExpr.LocalRef) ctx & Context.AllowGotoAndAllThrows
-              else Context.Clean;
+              match (target) {
+                | TExpr.LocalRef (decl) =>
+                  if (decl.ExpandedBlockReturn)
+                    ctx & Context.AllowGotoAndAllThrows
+                  else
+                    ctx & Context.AllowGotoAndAllThrows & ~Context.AllowGoto
+                | _ => Context.Clean
+              }
             def source = Walk (src_ctx, source);
 
             match (target) {



More information about the svn mailing list