]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Better handling of [NoReturn] call inside finally clause
authorRico Tzschichholz <ricotz@ubuntu.com>
Mon, 6 Feb 2023 17:52:11 +0000 (18:52 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Mon, 6 Feb 2023 18:06:01 +0000 (19:06 +0100)
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

tests/Makefile.am
tests/control-flow/finally-no-return.c-expected [new file with mode: 0644]
tests/control-flow/finally-no-return.vala [new file with mode: 0644]
vala/valaflowanalyzer.vala

index 518b892a936ccacff2b4dcf508d8447b9c3f2ef1..9257e61ae6c661537dddb9324bea5685b58be9de 100644 (file)
@@ -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 (file)
index 0000000..732c8bc
--- /dev/null
@@ -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 <glib.h>
+
+#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 (file)
index 0000000..285112a
--- /dev/null
@@ -0,0 +1,14 @@
+void foo () throws Error {
+}
+
+[NoReturn]
+void bar () {
+}
+
+void main () {
+       try {
+               foo ();
+       } finally {
+               bar ();
+       }
+}
index 9c9457fd5295772217cbcf4a9b0cadda0aaf0de6..45f524546cfcb9059a7252087d28c3a3f66c1e20 100644 (file)
@@ -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;