[svn] r6015: nemerle/trunk/ncc: generation/Typer3.n testsuite/negative/yield3.n testsuite/positive/yield.n

malekith svnadmin at nemerle.org
Sun Dec 18 14:12:54 CET 2005


Log:
Prevent yield usage in exception blocks.

Author: malekith
Date: Sun Dec 18 14:12:53 2005
New Revision: 6015

Added:
   nemerle/trunk/ncc/testsuite/negative/yield3.n
Modified:
   nemerle/trunk/ncc/generation/Typer3.n
   nemerle/trunk/ncc/testsuite/positive/yield.n

Modified: nemerle/trunk/ncc/generation/Typer3.n
==============================================================================
--- nemerle/trunk/ncc/generation/Typer3.n	(original)
+++ nemerle/trunk/ncc/generation/Typer3.n	Sun Dec 18 14:12:53 2005
@@ -758,6 +758,13 @@
 
       def thisref = TExpr.This (clo_type.GetMemType ());
 
+      def look_for_invalid_yield (expr : TExpr) {
+        | Assign (LocalRef (decl), _) when decl.Name == "_N_current" =>
+          Message.Error ("using `yield' is not allowed here");
+          null
+        | _ => null
+      }
+
       def rewrite (expr : TExpr) {
         | TryFinally (body, handler) =>
           def fld = clo_type.DefineAndReturn (<[ decl: 
@@ -771,11 +778,16 @@
           dispose_expr = TExpr.Sequence (dispose_expr.Type, for_dispose, dispose_expr);
           
           BuildRevSequence (
-             [handler, 
+             [handler.Walk (look_for_invalid_yield), 
               TExpr.Assign (InternalType.Void, fldref, TExpr.FalseLiteral),
               body.Walk (rewrite),
               TExpr.Assign (InternalType.Void, fldref, TExpr.TrueLiteral)])
 
+        | TryWith (body, _, handler) =>
+          _ = body.Walk (look_for_invalid_yield);
+          _ = handler.Walk (look_for_invalid_yield);
+          expr
+
         | _ => null
       }
       

Added: nemerle/trunk/ncc/testsuite/negative/yield3.n
==============================================================================
--- (empty file)
+++ nemerle/trunk/ncc/testsuite/negative/yield3.n	Sun Dec 18 14:12:53 2005
@@ -0,0 +1,23 @@
+using System.Collections.Generic;
+
+class D
+{
+  public GetEnumerator1 () : IEnumerator [int]
+  {
+    try {
+      yield 7; // E: using `yield' is not allowed here
+    } catch {
+      | _ => {}
+    }
+  }
+  
+  public GetEnumerator2 () : IEnumerator [int]
+  {
+    try {
+      {}
+    } catch {
+      | _ =>
+        yield 7; // E: using `yield' is not allowed here
+    }
+  }
+}

Modified: nemerle/trunk/ncc/testsuite/positive/yield.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/yield.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/yield.n	Sun Dec 18 14:12:53 2005
@@ -29,12 +29,7 @@
     yield qux.ToString ();
     yield ene;
     yield this.due;
-    try {
     yield rabe;
-    } catch {
-    | _ =>
-    yield rabe;
-    }
   }
 }
 



More information about the svn mailing list