Index: doc/working/exception/translate.c
===================================================================
--- doc/working/exception/translate.c	(revision e1055441d7a7018b263558a0295598546ad78ebc)
+++ doc/working/exception/translate.c	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -1,7 +1,9 @@
 /* Translation rules for exception handling code, from Cforall to C.
  *
- * Note that these are not final. Names, syntax and the exact translation
- * will be updated. The first section is the shared definitions, not generated
- * by the local translations but used by the translated code.
+ * Reminder: This is not final. Besides names and things it is also going very
+ * much for correctness and simplisity over efficiency.
+ *
+ * The first section is the shared definitions, not generated by the local
+ * translations but used by the translated code.
  *
  * Most of these exist only after translation (in C code). The first (the
@@ -16,4 +18,8 @@
 typedef int exception;
 
+// Will have to be availibe to user. Consider new name. Requires tagged types.
+forall(dtype parent | tagged(parent), dtype child | tagged(child))
+parent *dynamic_cast(child *);
+
 void __throw_terminate(exception except) __attribute__((noreturn));
 void __rethrow_terminate() __attribute__((noreturn));
@@ -116,13 +122,17 @@
 		}
 		int match1(exception except) {
-			OtherException inner_except;
-			if (dynamic_cast__SomeException(except)) {
-				return 1;
-			}
-			else if ( (inner_except = dynamic_cast__OtherException(except)) &&
-					inner_except.priority > 3) {
-				return 2;
-			}
-			else return 0;
+			{
+				if (dynamic_cast__SomeException(except)) {
+					return 1;
+				}
+			}
+			{
+				OtherException err;
+				if ( (err = dynamic_cast__OtherException(except)) &&
+						err.priority > 3) {
+					return 2;
+				}
+			}
+			return 0;
 		}
 		__try_terminate(try1, catch1, match1);
@@ -151,15 +161,19 @@
 	{
 		bool handle1(exception except) {
-			OtherException inner_except;
-			if (dynamic_cast__SomeException(except)) {
-				fiddleThing();
-				return true;
-			} else if (dynamic_cast__OtherException(except) &&
-					inner_except.priority > 3) {
-				twiddleWidget();
-				return true;
-			} else {
-				return false;
-			}
+			{
+				if (dynamic_cast__SomeException(except)) {
+					fiddleThing();
+					return true;
+				}
+			}
+			{
+				OtherException err;
+ 				if ( ( err = dynamic_cast__OtherException(except) ) &&
+						err.priority > 3) {
+					twiddleWidget();
+					return true;
+				}
+			}
+			return false;
 		}
 		struct __try_resume_node data =
@@ -230,10 +244,11 @@
 		}
 		bool handle1(exception except) {
-			if (dynamic_cast__SomeException(except)) {
-				fiddleThing();
-				return true;
-			} else {
-				return false;
-			}
+			{
+				if (dynamic_cast__SomeException(except)) {
+					fiddleThing();
+					return true;
+				}
+			}
+			return false;
 		}
 		struct __cleanup_hook generated_name
@@ -273,7 +288,9 @@
 	{
 		bool handle1() {
-			if (dynamic_cast__OtherException(except)) {
-				twiddleWidget();
-				return true;
+			{
+				if (dynamic_cast__OtherException(except)) {
+					twiddleWidget();
+					return true;
+				}
 			}
 			return false;
@@ -297,6 +314,8 @@
 		}
 		int match1(exception except) {
-			if (dynamic_cast__SomeException(except)) {
-				return 1;
+			{
+				if (dynamic_cast__SomeException(except)) {
+					return 1;
+				}
 			}
 			return 0;
