From 00be95dd7202c6f536f9cb75c06cf915ee23f204 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sun, 23 Aug 2009 23:00:32 -0400 Subject: [PATCH] syntax: fix 'break' with value in default closures Break return type and return value is associated with the method return type and return value. Signed-off-by: Jean Privat --- src/syntax/icode_generation.nit | 2 ++ src/syntax/typing.nit | 8 +++++++- tests/base_closure_default1.nit | 2 ++ tests/base_closure_default2.nit | 2 ++ tests/base_closure_default3.nit | 2 ++ tests/base_closure_default4.nit | 2 ++ tests/sav/base_closure_default1_alt3.sav | 2 +- tests/sav/base_closure_default1_alt6.sav | 7 +++++++ tests/sav/base_closure_default1_alt7.sav | 1 + tests/sav/base_closure_default2_alt3.sav | 2 +- tests/sav/base_closure_default2_alt6.sav | 2 +- tests/sav/base_closure_default2_alt7.sav | 7 +++++++ tests/sav/base_closure_default2_alt8.sav | 1 + tests/sav/base_closure_default3_alt3.sav | 2 +- tests/sav/base_closure_default3_alt5.sav | 8 +++++++- tests/sav/base_closure_default3_alt6.sav | 1 + tests/sav/base_closure_default4_alt3.sav | 2 +- tests/sav/base_closure_default4_alt6.sav | 7 +++++++ tests/sav/base_closure_default4_alt7.sav | 1 + 19 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 tests/sav/base_closure_default1_alt6.sav create mode 100644 tests/sav/base_closure_default1_alt7.sav create mode 100644 tests/sav/base_closure_default2_alt7.sav create mode 100644 tests/sav/base_closure_default2_alt8.sav create mode 100644 tests/sav/base_closure_default3_alt6.sav create mode 100644 tests/sav/base_closure_default4_alt6.sav create mode 100644 tests/sav/base_closure_default4_alt7.sav diff --git a/src/syntax/icode_generation.nit b/src/syntax/icode_generation.nit index fb4a801..08466d9 100644 --- a/src/syntax/icode_generation.nit +++ b/src/syntax/icode_generation.nit @@ -347,6 +347,8 @@ redef class AClosureDecl 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 diff --git a/src/syntax/typing.nit b/src/syntax/typing.nit index c3a5ffc..8bbcda8 100644 --- a/src/syntax/typing.nit +++ b/src/syntax/typing.nit @@ -274,7 +274,10 @@ redef class AClosureDecl 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) @@ -289,6 +292,9 @@ redef class AClosureDecl end end end + 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 diff --git a/tests/base_closure_default1.nit b/tests/base_closure_default1.nit index dc5bbbb..560e2cd 100644 --- a/tests/base_closure_default1.nit +++ b/tests/base_closure_default1.nit @@ -24,6 +24,8 @@ class A #alt3# abort #alt4# continue #alt5# continue 20 + #alt6# break + #alt7# break 1 20.output end do diff --git a/tests/base_closure_default2.nit b/tests/base_closure_default2.nit index ce6f476..a8d7251 100644 --- a/tests/base_closure_default2.nit +++ b/tests/base_closure_default2.nit @@ -24,6 +24,8 @@ class A #alt3# abort #alt4# continue #alt5# continue 20 + #alt7# break + #alt8# break 1 (i * 10).output end do diff --git a/tests/base_closure_default3.nit b/tests/base_closure_default3.nit index 9b413bc..44764de 100644 --- a/tests/base_closure_default3.nit +++ b/tests/base_closure_default3.nit @@ -23,6 +23,8 @@ class A #alt2# return 1 #alt3# abort #alt4# continue + #alt5# break + #alt6# break 1 continue 20 #!alt5# end do diff --git a/tests/base_closure_default4.nit b/tests/base_closure_default4.nit index 0cb3d77..1209c18 100644 --- a/tests/base_closure_default4.nit +++ b/tests/base_closure_default4.nit @@ -23,6 +23,8 @@ class A #alt2# return -1 #alt3# abort #alt4# continue + #alt6# break + #alt7# break 1 continue (i * 10) #!alt5# end do diff --git a/tests/sav/base_closure_default1_alt3.sav b/tests/sav/base_closure_default1_alt3.sav index 924c5c9..7db5fc4 100644 --- a/tests/sav/base_closure_default1_alt3.sav +++ b/tests/sav/base_closure_default1_alt3.sav @@ -7,5 +7,5 @@ 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) `------------------- - - - diff --git a/tests/sav/base_closure_default1_alt6.sav b/tests/sav/base_closure_default1_alt6.sav new file mode 100644 index 0000000..e8350ed --- /dev/null +++ b/tests/sav/base_closure_default1_alt6.sav @@ -0,0 +1,7 @@ +0 +1 +2 +3 +0 +1 +0 diff --git a/tests/sav/base_closure_default1_alt7.sav b/tests/sav/base_closure_default1_alt7.sav new file mode 100644 index 0000000..b12ac5d --- /dev/null +++ b/tests/sav/base_closure_default1_alt7.sav @@ -0,0 +1 @@ +alt/base_closure_default1_alt7.nit:28,5--11: Error: break without value required in this block. diff --git a/tests/sav/base_closure_default2_alt3.sav b/tests/sav/base_closure_default2_alt3.sav index 9dc27f1..75d7d31 100644 --- a/tests/sav/base_closure_default2_alt3.sav +++ b/tests/sav/base_closure_default2_alt3.sav @@ -7,5 +7,5 @@ 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) `------------------- - - - diff --git a/tests/sav/base_closure_default2_alt6.sav b/tests/sav/base_closure_default2_alt6.sav index c1ca6e5..2ba416d 100644 --- a/tests/sav/base_closure_default2_alt6.sav +++ b/tests/sav/base_closure_default2_alt6.sav @@ -1 +1 @@ -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. diff --git a/tests/sav/base_closure_default2_alt7.sav b/tests/sav/base_closure_default2_alt7.sav new file mode 100644 index 0000000..e8350ed --- /dev/null +++ b/tests/sav/base_closure_default2_alt7.sav @@ -0,0 +1,7 @@ +0 +1 +2 +3 +0 +1 +0 diff --git a/tests/sav/base_closure_default2_alt8.sav b/tests/sav/base_closure_default2_alt8.sav new file mode 100644 index 0000000..30febd3 --- /dev/null +++ b/tests/sav/base_closure_default2_alt8.sav @@ -0,0 +1 @@ +alt/base_closure_default2_alt8.nit:28,5--11: Error: break without value required in this block. diff --git a/tests/sav/base_closure_default3_alt3.sav b/tests/sav/base_closure_default3_alt3.sav index 24832da..9218fde 100644 --- a/tests/sav/base_closure_default3_alt3.sav +++ b/tests/sav/base_closure_default3_alt3.sav @@ -7,5 +7,5 @@ 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) `------------------- - - - diff --git a/tests/sav/base_closure_default3_alt5.sav b/tests/sav/base_closure_default3_alt5.sav index 293e7a5..e8350ed 100644 --- a/tests/sav/base_closure_default3_alt5.sav +++ b/tests/sav/base_closure_default3_alt5.sav @@ -1 +1,7 @@ -alt/base_closure_default3_alt5.nit:21,3--11: Control error: Reached end of block (a 'continue' with a value was expected). +0 +1 +2 +3 +0 +1 +0 diff --git a/tests/sav/base_closure_default3_alt6.sav b/tests/sav/base_closure_default3_alt6.sav new file mode 100644 index 0000000..0203763 --- /dev/null +++ b/tests/sav/base_closure_default3_alt6.sav @@ -0,0 +1 @@ +alt/base_closure_default3_alt6.nit:27,5--11: Error: break without value required in this block. diff --git a/tests/sav/base_closure_default4_alt3.sav b/tests/sav/base_closure_default4_alt3.sav index 0812bec..5ded1f8 100644 --- a/tests/sav/base_closure_default4_alt3.sav +++ b/tests/sav/base_closure_default4_alt3.sav @@ -7,5 +7,5 @@ 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) `------------------- - - - diff --git a/tests/sav/base_closure_default4_alt6.sav b/tests/sav/base_closure_default4_alt6.sav new file mode 100644 index 0000000..e8350ed --- /dev/null +++ b/tests/sav/base_closure_default4_alt6.sav @@ -0,0 +1,7 @@ +0 +1 +2 +3 +0 +1 +0 diff --git a/tests/sav/base_closure_default4_alt7.sav b/tests/sav/base_closure_default4_alt7.sav new file mode 100644 index 0000000..05e9908 --- /dev/null +++ b/tests/sav/base_closure_default4_alt7.sav @@ -0,0 +1 @@ +alt/base_closure_default4_alt7.nit:27,5--11: Error: break without value required in this block. -- 1.7.9.5