From: Rico Tzschichholz Date: Mon, 6 Feb 2023 17:52:11 +0000 (+0100) Subject: vala: Better handling of [NoReturn] call inside finally clause X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6dec23dc1c5b8567d0e2eddeab226e5cbd817cdc;p=thirdparty%2Fvala.git vala: Better handling of [NoReturn] call inside finally clause This caused the following criticals: vala_flow_analyzer_jump_target_construct_finally_clause: assertion 'last_block != NULL' failed vala_flow_analyzer_jump_target_get_is_exit_target: assertion 'self != NULL' failed vala_flow_analyzer_jump_target_get_is_error_target: assertion 'self != NULL' failed vala_flow_analyzer_jump_target_get_is_finally_clause: assertion 'self != NULL' failed --- diff --git a/tests/Makefile.am b/tests/Makefile.am index 518b892a9..9257e61ae 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -296,6 +296,7 @@ TESTS = \ control-flow/continue-invalid.test \ control-flow/double-catch.test \ control-flow/expressions-conditional.vala \ + control-flow/finally-no-return.vala \ control-flow/finally-return.test \ control-flow/for.vala \ control-flow/for-switch-continue.vala \ diff --git a/tests/control-flow/finally-no-return.c-expected b/tests/control-flow/finally-no-return.c-expected new file mode 100644 index 000000000..732c8bcde --- /dev/null +++ b/tests/control-flow/finally-no-return.c-expected @@ -0,0 +1,59 @@ +/* control_flow_finally_no_return.c generated by valac, the Vala compiler + * generated from control_flow_finally_no_return.vala, do not modify */ + +#include + +#if !defined(VALA_EXTERN) +#if defined(_WIN32) || defined(__CYGWIN__) +#define VALA_EXTERN __declspec(dllexport) extern +#elif __GNUC__ >= 4 +#define VALA_EXTERN __attribute__((visibility("default"))) extern +#else +#define VALA_EXTERN extern +#endif +#endif + +VALA_EXTERN void foo (GError** error); +VALA_EXTERN void bar (void); +static void _vala_main (void); + +void +foo (GError** error) +{ +} + +void +bar (void) +{ +} + +static void +_vala_main (void) +{ + GError* _inner_error0_ = NULL; + { + foo (&_inner_error0_); + if (G_UNLIKELY (_inner_error0_ != NULL)) { + goto __finally0; + } + } + __finally0: + { + GError* _inner_error1_ = NULL; + bar (); + } + if (G_UNLIKELY (_inner_error0_ != NULL)) { + g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error0_->message, g_quark_to_string (_inner_error0_->domain), _inner_error0_->code); + g_clear_error (&_inner_error0_); + return; + } +} + +int +main (int argc, + char ** argv) +{ + _vala_main (); + return 0; +} + diff --git a/tests/control-flow/finally-no-return.vala b/tests/control-flow/finally-no-return.vala new file mode 100644 index 000000000..285112a3a --- /dev/null +++ b/tests/control-flow/finally-no-return.vala @@ -0,0 +1,14 @@ +void foo () throws Error { +} + +[NoReturn] +void bar () { +} + +void main () { + try { + foo (); + } finally { + bar (); + } +} diff --git a/vala/valaflowanalyzer.vala b/vala/valaflowanalyzer.vala index 9c9457fd5..45f524546 100644 --- a/vala/valaflowanalyzer.vala +++ b/vala/valaflowanalyzer.vala @@ -1018,7 +1018,9 @@ public class Vala.FlowAnalyzer : CodeVisitor { return; } - jump_stack.add (new JumpTarget.finally_clause (finally_block, current_block)); + if (current_block != null) { + jump_stack.add (new JumpTarget.finally_clause (finally_block, current_block)); + } } int finally_jump_stack_size = jump_stack.size;