syntax: track exits context in do blocks
authorJean Privat <jean@pryen.org>
Fri, 15 Jan 2010 20:13:26 +0000 (15:13 -0500)
committerJean Privat <jean@pryen.org>
Fri, 15 Jan 2010 20:13:26 +0000 (15:13 -0500)
Signed-off-by: Jean Privat <jean@pryen.org>

src/syntax/typing.nit
tests/base_var_type_evolution_null4.nit
tests/sav/base_var_type_evolution_null4.sav
tests/sav/base_var_type_evolution_null4_alt4.sav [new file with mode: 0644]

index 618ace9..980eba8 100644 (file)
@@ -478,9 +478,20 @@ redef class ADoExpr
                var escapable = new BreakOnlyEscapableBlock(self)
                _escapable = escapable
                v.escapable_ctx.push(escapable, n_label)
+               var old_var_ctx = v.variable_ctx
 
                super
 
+               # Add the end of the block as an exit context
+               if not v.variable_ctx.unreash then
+                       escapable.break_variable_contexts.add(v.variable_ctx)
+               end
+
+               # Merge all exit contexts
+               if not escapable.break_variable_contexts.is_empty then
+                       v.variable_ctx = old_var_ctx.merge(self, escapable.break_variable_contexts, v.base_variable_ctx)
+               end
+
                v.escapable_ctx.pop
                _is_typed = true
        end
index 18a88d0..b49911c 100644 (file)
@@ -50,3 +50,16 @@ loop
 end
 eat_na(a)
 eat_a(a)
+
+a = get_a
+do
+       eat_na(a)
+       if rand and a != null then
+               eat_a(a)
+               break label doblock
+       end
+       abort #!alt4#
+end label doblock
+eat_na(a)
+eat_a(a)
+
diff --git a/tests/sav/base_var_type_evolution_null4_alt4.sav b/tests/sav/base_var_type_evolution_null4_alt4.sav
new file mode 100644 (file)
index 0000000..6df1521
--- /dev/null
@@ -0,0 +1 @@
+alt/base_var_type_evolution_null4_alt4.nit:63,7: Type error: expected A, got nullable A