summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
220823e)
Break return type and return value is associated with the method return
type and return value.
Signed-off-by: Jean Privat <jean@pryen.org>
19 files changed:
v.seq = iclos.body
escapable.continue_seq = iclos.body
escapable.continue_value = iclos.result
v.seq = iclos.body
escapable.continue_seq = iclos.body
escapable.continue_value = iclos.result
+ escapable.break_seq = v.return_seq
+ escapable.break_value = v.return_value
n_signature.fill_iroutine_parameters(v, variable.closure.signature, iclos.params, null)
if n_expr != null then
n_signature.fill_iroutine_parameters(v, variable.closure.signature, iclos.params, null)
if n_expr != null then
v.base_variable_ctx = v.variable_ctx
v.variable_ctx = v.variable_ctx.sub(self)
v.base_variable_ctx = v.variable_ctx
v.variable_ctx = v.variable_ctx.sub(self)
- var escapable = new EscapableClosure(self, variable.closure, null)
+ var blist: nullable Array[AExpr] = null
+ var t = v.local_property.signature.return_type
+ if t != null then blist = new Array[AExpr]
+ var escapable = new EscapableClosure(self, variable.closure, blist)
_escapable = escapable
v.escapable_ctx.push(escapable, null)
_escapable = escapable
v.escapable_ctx.push(escapable, null)
+ if blist != null then for x in blist do
+ v.check_conform_expr(x, t)
+ end
old_var_ctx.merge(v.variable_ctx)
v.variable_ctx = old_var_ctx
old_var_ctx.merge(v.variable_ctx)
v.variable_ctx = old_var_ctx
#alt3# abort
#alt4# continue
#alt5# continue 20
#alt3# abort
#alt4# continue
#alt5# continue 20
+ #alt6# break
+ #alt7# break 1
#alt3# abort
#alt4# continue
#alt5# continue 20
#alt3# abort
#alt4# continue
#alt5# continue 20
+ #alt7# break
+ #alt8# break 1
#alt2# return 1
#alt3# abort
#alt4# continue
#alt2# return 1
#alt3# abort
#alt4# continue
+ #alt5# break
+ #alt6# break 1
continue 20 #!alt5#
end
do
continue 20 #!alt5#
end
do
#alt2# return -1
#alt3# abort
#alt4# continue
#alt2# return -1
#alt3# abort
#alt4# continue
+ #alt6# break
+ #alt7# break 1
continue (i * 10) #!alt5#
end
do
continue (i * 10) #!alt5#
end
do
Aborted (alt/base_closure_default1_alt3.nit:24)
,---- Stack trace -- - - -
| base_closure_default1_alt3::A::foo (alt/base_closure_default1_alt3.nit:20)
Aborted (alt/base_closure_default1_alt3.nit:24)
,---- Stack trace -- - - -
| base_closure_default1_alt3::A::foo (alt/base_closure_default1_alt3.nit:20)
-| base_closure_default1_alt3::Sys::(kernel::Sys::main) (alt/base_closure_default1_alt3.nit:36)
+| base_closure_default1_alt3::Sys::(kernel::Sys::main) (alt/base_closure_default1_alt3.nit:38)
`------------------- - - -
`------------------- - - -
--- /dev/null
+alt/base_closure_default1_alt7.nit:28,5--11: Error: break without value required in this block.
Aborted (alt/base_closure_default2_alt3.nit:24)
,---- Stack trace -- - - -
| base_closure_default2_alt3::A::foo (alt/base_closure_default2_alt3.nit:20)
Aborted (alt/base_closure_default2_alt3.nit:24)
,---- Stack trace -- - - -
| base_closure_default2_alt3::A::foo (alt/base_closure_default2_alt3.nit:20)
-| base_closure_default2_alt3::Sys::(kernel::Sys::main) (alt/base_closure_default2_alt3.nit:37)
+| base_closure_default2_alt3::Sys::(kernel::Sys::main) (alt/base_closure_default2_alt3.nit:39)
`------------------- - - -
`------------------- - - -
-alt/base_closure_default2_alt6.nit:32,3: Error: Method or variable 'i' unknown in A.
+alt/base_closure_default2_alt6.nit:34,3: Error: Method or variable 'i' unknown in A.
--- /dev/null
+alt/base_closure_default2_alt8.nit:28,5--11: Error: break without value required in this block.
Aborted (alt/base_closure_default3_alt3.nit:24)
,---- Stack trace -- - - -
| base_closure_default3_alt3::A::foo (alt/base_closure_default3_alt3.nit:20)
Aborted (alt/base_closure_default3_alt3.nit:24)
,---- Stack trace -- - - -
| base_closure_default3_alt3::A::foo (alt/base_closure_default3_alt3.nit:20)
-| base_closure_default3_alt3::Sys::(kernel::Sys::main) (alt/base_closure_default3_alt3.nit:35)
+| base_closure_default3_alt3::Sys::(kernel::Sys::main) (alt/base_closure_default3_alt3.nit:37)
`------------------- - - -
`------------------- - - -
-alt/base_closure_default3_alt5.nit:21,3--11: Control error: Reached end of block (a 'continue' with a value was expected).
--- /dev/null
+alt/base_closure_default3_alt6.nit:27,5--11: Error: break without value required in this block.
Aborted (alt/base_closure_default4_alt3.nit:24)
,---- Stack trace -- - - -
| base_closure_default4_alt3::A::foo (alt/base_closure_default4_alt3.nit:20)
Aborted (alt/base_closure_default4_alt3.nit:24)
,---- Stack trace -- - - -
| base_closure_default4_alt3::A::foo (alt/base_closure_default4_alt3.nit:20)
-| base_closure_default4_alt3::Sys::(kernel::Sys::main) (alt/base_closure_default4_alt3.nit:35)
+| base_closure_default4_alt3::Sys::(kernel::Sys::main) (alt/base_closure_default4_alt3.nit:37)
`------------------- - - -
`------------------- - - -
--- /dev/null
+alt/base_closure_default4_alt7.nit:27,5--11: Error: break without value required in this block.