[svn] r7587: nemerle/trunk/ncc: generation/Typer3.n testsuite/negative/base-calls.n

divan svnadmin at nemerle.org
Tue Apr 10 18:20:29 CEST 2007


Log:
Generate error for ctor calls inside local funs.

Author: divan
Date: Tue Apr 10 18:20:26 2007
New Revision: 7587

Modified:
   nemerle/trunk/ncc/generation/Typer3.n
   nemerle/trunk/ncc/testsuite/negative/base-calls.n

Modified: nemerle/trunk/ncc/generation/Typer3.n
==============================================================================
--- nemerle/trunk/ncc/generation/Typer3.n	(original)
+++ nemerle/trunk/ncc/generation/Typer3.n	Tue Apr 10 18:20:26 2007
@@ -95,6 +95,7 @@
     ptyper : Typer;
     ptyper2 : Typer2;
     is_ctor : bool;
+    is_in_ctor : bool;
     
     // current method we're working on
     the_method : MethodBuilder;
@@ -177,6 +178,7 @@
 
       this.parent = parent;
       is_ctor = current_local_fun.name == ".ctor";
+      is_in_ctor = parent != null && (parent.is_ctor || parent.is_in_ctor);
     }
 
 
@@ -1307,6 +1309,31 @@
     FixBaseCall (clo_ini : TExpr = null) : void
     {
       // put base () / this () call before storing 'this' in closure inside constructor
+      when (is_in_ctor) {
+        //deny ctor calls from local funs
+        def f (_) {
+          | TExpr.Call (e, _, _) as o when IsCtor (e) 
+           => Message.Error (o.loc, "Constructor call inside local function "
+                                      "or loop isn't allowed");
+              Some (true)
+          | _ => None ()
+        }               
+        and check (e) {
+          SimpleFlow (e, f, false, seq, fork)
+        }
+        and seq (e) {
+          _ = List.Map (e, check);
+          true
+        }
+        and fork (e) {
+          _ = List.Map (e, seq);
+          true
+        };
+        match (current_local_fun.body) {
+          | FunBody.Typed (e) => _ = check (e)
+          | _ => ()
+        }
+      }
       mutable e = null;
       when (is_ctor)
       {

Modified: nemerle/trunk/ncc/testsuite/negative/base-calls.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/negative/base-calls.n	(original)
+++ nemerle/trunk/ncc/testsuite/negative/base-calls.n	Tue Apr 10 18:20:26 2007
@@ -63,3 +63,14 @@
     base (); // E: Base constructor call in struct isn't allowed
   }
 }
\ No newline at end of file
+
+class F {
+  this () {
+    def f () { 
+      base() // E: Constructor call inside local function or loop isn't allowed
+    };
+    _ = f;
+    for (mutable i = 0; i < 1; ++i)
+      base (); // E: Constructor call inside local function or loop isn't allowed
+  }
+}
\ No newline at end of file



More information about the svn mailing list