[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