[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