diff --git a/src/semantize/flow.nit b/src/semantize/flow.nit index 3d27623995..cedbfa72b5 100644 --- a/src/semantize/flow.nit +++ b/src/semantize/flow.nit @@ -305,7 +305,7 @@ redef class ABlockExpr v.enter_visit(e) else if not v.current_flow_context.is_already_unreachable then v.current_flow_context.is_already_unreachable = true - v.toolcontext.error(e.hot_location, "Error: unreachable statement.") + v.toolcontext.warning(e.hot_location, "unreachable", "Warning: unreachable statement.") end end end diff --git a/src/semantize/local_var_init.nit b/src/semantize/local_var_init.nit index 27c7ddda9e..613178602c 100644 --- a/src/semantize/local_var_init.nit +++ b/src/semantize/local_var_init.nit @@ -59,8 +59,8 @@ private class LocalVarInitVisitor assert variable != null if not maybe_unset_vars.has(variable) then return - var flow = node.after_flow_context.as(not null) - flow.set_vars.add(variable) + var flow = node.after_flow_context + if flow != null then flow.set_vars.add(variable) end fun check_is_set(node: AExpr, variable: nullable Variable) @@ -68,8 +68,8 @@ private class LocalVarInitVisitor assert variable != null if not maybe_unset_vars.has(variable) then return - var flow = node.after_flow_context.as(not null) - if not flow.is_variable_set(variable) then + var flow = node.after_flow_context + if flow != null and not flow.is_variable_set(variable) then self.toolcontext.error(node.hot_location, "Error: possibly unset variable `{variable}`.") # Remove the variable to avoid repeating errors self.maybe_unset_vars.remove(variable) diff --git a/src/semantize/typing.nit b/src/semantize/typing.nit index 98aba7771c..57424b88b6 100644 --- a/src/semantize/typing.nit +++ b/src/semantize/typing.nit @@ -634,9 +634,7 @@ private class TypeVisitor fun set_variable(node: AExpr, variable: Variable, mtype: nullable MType) do var flow = node.after_flow_context - assert flow != null - - flow.set_var(self, variable, mtype) + if flow != null then flow.set_var(self, variable, mtype) end # Find the exact representable most specific common super-type in `col`. diff --git a/tests/base_control_flow3.nit b/tests/base_control_flow3.nit new file mode 100644 index 0000000000..1e17ae1871 --- /dev/null +++ b/tests/base_control_flow3.nit @@ -0,0 +1,49 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import kernel + +var a +a = null +a = 1 + +a.output +return +# Below this line the code is unreachable + +var b +b = null +b = 1 +a.output +b.output +a = b +b = a + +if a == b then + a = b + b = a +else + a = null + b = null +end +a.output +b.output +var c = a.as(not null) +var d = b.as(Int) +var e +e.output + +#alt1#(b+1).output # Error +b = 1 +#alt1#(b+1).output # Still error diff --git a/tests/sav/base_control_flow2_alt1.res b/tests/sav/base_control_flow2_alt1.res index e569abe25d..9fc00f6239 100644 --- a/tests/sav/base_control_flow2_alt1.res +++ b/tests/sav/base_control_flow2_alt1.res @@ -1,4 +1,4 @@ -alt/base_control_flow2_alt1.nit:24,2: Error: unreachable statement. +alt/base_control_flow2_alt1.nit:24,2: Warning: unreachable statement. alt/base_control_flow2_alt1.nit:21,1--25,3: Warning: use `loop` instead of `while true do`. alt/base_control_flow2_alt1.nit:39,1--43,3: Warning: use `loop` instead of `while true do`. alt/base_control_flow2_alt1.nit:47,2--51,4: Warning: use `loop` instead of `while true do`. diff --git a/tests/sav/base_control_flow2_alt2.res b/tests/sav/base_control_flow2_alt2.res index 72d2608527..69e0191723 100644 --- a/tests/sav/base_control_flow2_alt2.res +++ b/tests/sav/base_control_flow2_alt2.res @@ -1,5 +1,5 @@ alt/base_control_flow2_alt2.nit:21,1--25,3: Warning: use `loop` instead of `while true do`. -alt/base_control_flow2_alt2.nit:30,2: Error: unreachable statement. +alt/base_control_flow2_alt2.nit:30,2: Warning: unreachable statement. alt/base_control_flow2_alt2.nit:39,1--43,3: Warning: use `loop` instead of `while true do`. alt/base_control_flow2_alt2.nit:47,2--51,4: Warning: use `loop` instead of `while true do`. alt/base_control_flow2_alt2.nit:45,1--55,3: Warning: use `loop` instead of `while true do`. diff --git a/tests/sav/base_control_flow2_alt3.res b/tests/sav/base_control_flow2_alt3.res index 4c19474522..455b848f2a 100644 --- a/tests/sav/base_control_flow2_alt3.res +++ b/tests/sav/base_control_flow2_alt3.res @@ -1,5 +1,5 @@ alt/base_control_flow2_alt3.nit:21,1--25,3: Warning: use `loop` instead of `while true do`. -alt/base_control_flow2_alt3.nit:42,2: Error: unreachable statement. +alt/base_control_flow2_alt3.nit:42,2: Warning: unreachable statement. alt/base_control_flow2_alt3.nit:39,1--43,3: Warning: use `loop` instead of `while true do`. alt/base_control_flow2_alt3.nit:47,2--51,4: Warning: use `loop` instead of `while true do`. alt/base_control_flow2_alt3.nit:45,1--55,3: Warning: use `loop` instead of `while true do`. diff --git a/tests/sav/base_control_flow2_alt4.res b/tests/sav/base_control_flow2_alt4.res index a5ac542c28..8fff0ef356 100644 --- a/tests/sav/base_control_flow2_alt4.res +++ b/tests/sav/base_control_flow2_alt4.res @@ -1,5 +1,5 @@ alt/base_control_flow2_alt4.nit:21,1--25,3: Warning: use `loop` instead of `while true do`. alt/base_control_flow2_alt4.nit:39,1--43,3: Warning: use `loop` instead of `while true do`. -alt/base_control_flow2_alt4.nit:50,3: Error: unreachable statement. +alt/base_control_flow2_alt4.nit:50,3: Warning: unreachable statement. alt/base_control_flow2_alt4.nit:47,2--51,4: Warning: use `loop` instead of `while true do`. alt/base_control_flow2_alt4.nit:45,1--55,3: Warning: use `loop` instead of `while true do`. diff --git a/tests/sav/base_control_flow2_alt5.res b/tests/sav/base_control_flow2_alt5.res index 593356c3db..3109d5840a 100644 --- a/tests/sav/base_control_flow2_alt5.res +++ b/tests/sav/base_control_flow2_alt5.res @@ -1,5 +1,5 @@ alt/base_control_flow2_alt5.nit:21,1--25,3: Warning: use `loop` instead of `while true do`. alt/base_control_flow2_alt5.nit:39,1--43,3: Warning: use `loop` instead of `while true do`. alt/base_control_flow2_alt5.nit:47,2--51,4: Warning: use `loop` instead of `while true do`. -alt/base_control_flow2_alt5.nit:54,2: Error: unreachable statement. +alt/base_control_flow2_alt5.nit:54,2: Warning: unreachable statement. alt/base_control_flow2_alt5.nit:45,1--55,3: Warning: use `loop` instead of `while true do`. diff --git a/tests/sav/base_control_flow2_alt6.res b/tests/sav/base_control_flow2_alt6.res index e035bfc639..15e6bc1578 100644 --- a/tests/sav/base_control_flow2_alt6.res +++ b/tests/sav/base_control_flow2_alt6.res @@ -2,4 +2,4 @@ alt/base_control_flow2_alt6.nit:21,1--25,3: Warning: use `loop` instead of `whil alt/base_control_flow2_alt6.nit:39,1--43,3: Warning: use `loop` instead of `while true do`. alt/base_control_flow2_alt6.nit:47,2--51,4: Warning: use `loop` instead of `while true do`. alt/base_control_flow2_alt6.nit:45,1--55,3: Warning: use `loop` instead of `while true do`. -alt/base_control_flow2_alt6.nit:60,2: Error: unreachable statement. +alt/base_control_flow2_alt6.nit:60,2: Warning: unreachable statement. diff --git a/tests/sav/base_control_flow2_alt7.res b/tests/sav/base_control_flow2_alt7.res index a27882caec..8dea3d654d 100644 --- a/tests/sav/base_control_flow2_alt7.res +++ b/tests/sav/base_control_flow2_alt7.res @@ -2,4 +2,4 @@ alt/base_control_flow2_alt7.nit:21,1--25,3: Warning: use `loop` instead of `whil alt/base_control_flow2_alt7.nit:39,1--43,3: Warning: use `loop` instead of `while true do`. alt/base_control_flow2_alt7.nit:47,2--51,4: Warning: use `loop` instead of `while true do`. alt/base_control_flow2_alt7.nit:45,1--55,3: Warning: use `loop` instead of `while true do`. -alt/base_control_flow2_alt7.nit:67,2: Error: unreachable statement. +alt/base_control_flow2_alt7.nit:67,2: Warning: unreachable statement. diff --git a/tests/sav/base_control_flow3.res b/tests/sav/base_control_flow3.res new file mode 100644 index 0000000000..e3ec4cf81b --- /dev/null +++ b/tests/sav/base_control_flow3.res @@ -0,0 +1,2 @@ +base_control_flow3.nit:25,1--5: Warning: unreachable statement. +1 diff --git a/tests/sav/base_control_flow3_alt1.res b/tests/sav/base_control_flow3_alt1.res new file mode 100644 index 0000000000..25a65d9e64 --- /dev/null +++ b/tests/sav/base_control_flow3_alt1.res @@ -0,0 +1,3 @@ +alt/base_control_flow3_alt1.nit:25,1--5: Warning: unreachable statement. +alt/base_control_flow3_alt1.nit:47,3: Error: method `+` does not exists in `nullable Object`. +alt/base_control_flow3_alt1.nit:49,3: Error: method `+` does not exists in `nullable Object`. diff --git a/tests/sav/base_control_flow_alt2.res b/tests/sav/base_control_flow_alt2.res index 9e5891b167..6284a482a0 100644 --- a/tests/sav/base_control_flow_alt2.res +++ b/tests/sav/base_control_flow_alt2.res @@ -1 +1 @@ -alt/base_control_flow_alt2.nit:23,2: Error: unreachable statement. +alt/base_control_flow_alt2.nit:23,2: Warning: unreachable statement. diff --git a/tests/sav/base_control_flow_alt3.res b/tests/sav/base_control_flow_alt3.res index 8c005cddf8..7b4d3ada16 100644 --- a/tests/sav/base_control_flow_alt3.res +++ b/tests/sav/base_control_flow_alt3.res @@ -1 +1 @@ -alt/base_control_flow_alt3.nit:54,2: Error: unreachable statement. +alt/base_control_flow_alt3.nit:54,2: Warning: unreachable statement. diff --git a/tests/sav/nit_args9.res b/tests/sav/nit_args9.res index 4181eb7811..694ecb8719 100644 --- a/tests/sav/nit_args9.res +++ b/tests/sav/nit_args9.res @@ -1,9 +1,6 @@ test_keep_going.nit:15,11--14: Error: class `Fail` not found in module `test_keep_going`. fun plop: Fail ^ -test_keep_going.nit:40,2--11: Error: unreachable statement. - 999.output - ^ test_keep_going.nit:26,2--5: Error: method or variable `fail` unknown in `Sys`. fail ^ @@ -13,10 +10,13 @@ test_keep_going.nit:35,5: Type Error: expected `Bool`, got `Int`. if 1 then abort ^ +test_keep_going.nit:40,2--11: Warning: unreachable statement. (unreachable) + 999.output + ^ test_keep_going.nit:44,18--21: Error: method `fail` does not exists in `Sys`. var a = new Sys.fail ^ -Errors: 6. Warnings: 0. +Errors: 5. Warnings: 1. 1 2 3 diff --git a/tests/sav/nitc_args12.res b/tests/sav/nitc_args12.res index 4181eb7811..694ecb8719 100644 --- a/tests/sav/nitc_args12.res +++ b/tests/sav/nitc_args12.res @@ -1,9 +1,6 @@ test_keep_going.nit:15,11--14: Error: class `Fail` not found in module `test_keep_going`. fun plop: Fail ^ -test_keep_going.nit:40,2--11: Error: unreachable statement. - 999.output - ^ test_keep_going.nit:26,2--5: Error: method or variable `fail` unknown in `Sys`. fail ^ @@ -13,10 +10,13 @@ test_keep_going.nit:35,5: Type Error: expected `Bool`, got `Int`. if 1 then abort ^ +test_keep_going.nit:40,2--11: Warning: unreachable statement. (unreachable) + 999.output + ^ test_keep_going.nit:44,18--21: Error: method `fail` does not exists in `Sys`. var a = new Sys.fail ^ -Errors: 6. Warnings: 0. +Errors: 5. Warnings: 1. 1 2 3 diff --git a/tests/sav/syntax_lambda.res b/tests/sav/syntax_lambda.res index 399d84085f..cff8831fcc 100644 --- a/tests/sav/syntax_lambda.res +++ b/tests/sav/syntax_lambda.res @@ -1 +1,17 @@ -syntax_lambda.nit:36,1--28: Error: unreachable statement. +syntax_lambda.nit:24,9--18: no implemented accept_typing for ALambdaExpr +syntax_lambda.nit:26,9--22: no implemented accept_typing for ALambdaExpr +syntax_lambda.nit:28,11--24: no implemented accept_typing for ALambdaExpr +syntax_lambda.nit:31,9--33,7: no implemented accept_typing for ALambdaExpr +syntax_lambda.nit:36,9--28: no implemented accept_typing for ALambdaExpr +syntax_lambda.nit:36,1--28: Warning: unreachable statement. +syntax_lambda.nit:37,10--26: no implemented accept_typing for ALambdaExpr +syntax_lambda.nit:39,9--30: no implemented accept_typing for ALambdaExpr +syntax_lambda.nit:41,9--48: no implemented accept_typing for ALambdaExpr +syntax_lambda.nit:43,10--29: no implemented accept_typing for ALambdaExpr +syntax_lambda.nit:45,5--18: no implemented accept_typing for ALambdaExpr +syntax_lambda.nit:46,5--18: no implemented accept_typing for ALambdaExpr +syntax_lambda.nit:49,1--51,8: no implemented accept_typing for ALambdaExpr +syntax_lambda.nit:55,2--15: no implemented accept_typing for ALambdaExpr +syntax_lambda.nit:56,1--14: no implemented accept_typing for ALambdaExpr +syntax_lambda.nit:58,9--60,10: no implemented accept_typing for ALambdaExpr +syntax_lambda.nit:64,1--32: no implemented accept_typing for ALambdaExpr