assume that control flow ends when invoking a method with the [NoReturn]
authorJuerg Billeter <j@bitron.ch>
Tue, 5 Feb 2008 18:45:05 +0000 (18:45 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Tue, 5 Feb 2008 18:45:05 +0000 (18:45 +0000)
2008-02-05  Juerg Billeter  <j@bitron.ch>

* vala/valacfgbuilder.vala: assume that control flow ends when
  invoking a method with the [NoReturn] attribute

* vapi/glib-2.0.vapi: add [NoReturn] to assert_not_reached

svn path=/trunk/; revision=974

ChangeLog
vala/valacfgbuilder.vala
vapi/glib-2.0.vapi

index a1119bb..39eb778 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2008-02-05  Jürg Billeter  <j@bitron.ch>
 
+       * vala/valacfgbuilder.vala: assume that control flow ends when
+         invoking a method with the [NoReturn] attribute
+
+       * vapi/glib-2.0.vapi: add [NoReturn] to assert_not_reached
+
+2008-02-05  Jürg Billeter  <j@bitron.ch>
+
        * vala/valasemanticanalyzer.vala: set tree_can_fail for assignments
          that can fail
 
index 165b1c9..470b47a 100644 (file)
@@ -166,6 +166,16 @@ public class Vala.CFGBuilder : CodeVisitor {
                current_block.add_node (stmt);
 
                handle_errors (stmt);
+
+               if (stmt.expression is InvocationExpression) {
+                       var expr = (InvocationExpression) stmt.expression;
+                       var ma = expr.call as MemberAccess;
+                       if (ma.symbol_reference != null && ma.symbol_reference.get_attribute ("NoReturn") != null) {
+                               current_block = null;
+                               unreachable_reported = false;
+                               return;
+                       }
+               }
        }
 
        public override void visit_if_statement (IfStatement! stmt) {
index feb3732..bf7ee3b 100644 (file)
@@ -1395,6 +1395,7 @@ namespace GLib {
 
        public static void return_if_fail (bool expr);
        public static void assert (bool expr);
+       [NoReturn]
        public static void assert_not_reached ();
 
        /* Message Logging */