diff --git a/src/snc/gen_ss_code.c b/src/snc/gen_ss_code.c
index 5a344e5c71bf96a937ce1959937548c9641e2478..6a7c88a40756caf33629b699bf42a316c472680c 100644
--- a/src/snc/gen_ss_code.c
+++ b/src/snc/gen_ss_code.c
@@ -151,20 +151,21 @@ static void gen_local_var_decls(Expr *scope, int level)
 	/* Convert internal type to `C' type */
 	foreach (vp, var_list->first)
 	{
-		if (vp->decl && vp->type->tag != T_NONE)
-		{
-			gen_line_marker(vp->decl);
-			indent(level);
-			gen_var_decl(vp);
+		assert(vp->type->tag != T_NONE);
+		assert(vp->type->tag != T_EVFLAG);
+		assert(vp->decl);
 
-			/* optional initialisation */
-			if (vp->init)
-			{
-				gen_code(" = ");
-				gen_expr(C_INIT, vp->init, level);
-			}
-			gen_code(";\n");
+		gen_line_marker(vp->decl);
+		indent(level);
+		gen_var_decl(vp);
+
+		/* optional initialisation */
+		if (vp->init)
+		{
+			gen_code(" = ");
+			gen_expr(C_INIT, vp->init, level);
 		}
+		gen_code(";\n");
 	}
 }
 
@@ -513,9 +514,7 @@ static void gen_expr(
 		break;
 	case E_CAST:
 		gen_code("(");
-		/* gen_type_expr(ep->cast_type); */
-		assert(ep->cast_type->type == D_DECL);
-		gen_var_decl(ep->cast_type->extra.e_decl);
+		gen_expr(context, ep->cast_type, 0);
 		gen_code(")");
 		gen_expr(context, ep->cast_operand, 0);
 		break;
@@ -532,12 +531,15 @@ static void gen_expr(
 		indent(level);
 		gen_code("%s\n", ep->value);
 		break;
+	case D_DECL:
+		gen_var_decl(ep->extra.e_decl);
+		break;
 	default:
-		assert(impossible);
 #ifdef DEBUG
 		report_at_expr(ep, "unhandled expression (%s:%s)\n",
 			expr_type_name(ep), ep->value);
 #endif
+		assert(impossible);
 	}
 }
 
@@ -812,7 +814,16 @@ static void gen_user_var_init(Expr *prog, int level)
 	{
 		if (vp->init)
 		{
-			gen_var_init(vp, level);
+			if (vp->type->tag == T_NONE)
+				error_at_expr(vp->init,
+					"foreign variable '%s' cannot be initialized\n",
+					vp->name);
+			else if (vp->type->tag == T_EVFLAG)
+				error_at_expr(vp->init,
+					"event flag '%s' cannot be initialized\n",
+					vp->name);
+			else
+				gen_var_init(vp, level);
 		}
 	}
 	/* state and state set variables */
diff --git a/src/snc/snl.lem b/src/snc/snl.lem
index 4881a225ed53d544443b46b65690af348e58623d..b64f0750f050062ed33b8e747ffde3ff462e0b34 100644
--- a/src/snc/snl.lem
+++ b/src/snc/snl.lem
@@ -399,6 +399,8 @@ expr(p) ::= LPAREN(t) comma_expr(x) RPAREN.		{ p = expr(E_PAREN, t, x); }
 // Primary Expression and Unary Postfix Operators
 expr(p) ::= NAME(t) LPAREN args(xs) RPAREN.	 [POST] { p = expr(E_FUNC,   t, xs); }
 expr(p) ::= EXIT(t) LPAREN args(xs) RPAREN.	 [POST] { p = expr(E_FUNC,   t, xs); }
+expr(p) ::= SIZEOF(t) LPAREN expr(x) RPAREN.	 [POST] { p = expr(E_FUNC,   t, x); }
+expr(p) ::= SIZEOF(t) LPAREN type_expr(x) RPAREN.[POST] { p = expr(E_FUNC,   t, x); }
 expr(p) ::= expr(x) LBRACKET(t) expr(y) RBRACKET.[POST] { p = expr(E_SUBSCR, t, x, y); }
 expr(p) ::= expr(x) PERIOD(t)  expr(y).		 [POST] { p = expr(E_BINOP,  t, x, y); }
 expr(p) ::= expr(x) POINTER(t) expr(y).		 [POST] { p = expr(E_BINOP,  t, x, y); }
diff --git a/src/snc/snl.re b/src/snc/snl.re
index d29843410f980fabb358f590ba49fcb6436ecc58..e8f4c7081cb5069ac2cf3c1a337633ae216f0870 100644
--- a/src/snc/snl.re
+++ b/src/snc/snl.re
@@ -251,6 +251,7 @@ snl:
 	"option"	{ KEYWORD(OPTION,	"option"); }
 	"program"	{ KEYWORD(PROGRAM,	"program"); }
 	"short"		{ TYPEWORD(SHORT,	"short"); }
+	"sizeof"	{ TYPEWORD(SIZEOF,	"sizeof"); }
 	"ss"		{ KEYWORD(SS,		"ss"); }
 	"state"		{ KEYWORD(STATE,	"state"); }
 	"string"	{ KEYWORD(STRING,	"string"); }
diff --git a/src/snc/var_types.c b/src/snc/var_types.c
index f50028440352cc524bac00f844979445187d5634..31c2e2c69192e0de522d9b7fd6dc678504038d42 100644
--- a/src/snc/var_types.c
+++ b/src/snc/var_types.c
@@ -243,7 +243,7 @@ static void gen_array_pointer(Type *t, enum type_tag last_tag, char *name)
         break;
     default:
         if (name)
-            gen_code("%s", name);
+            gen_code(" %s", name);
         break;
     }
 }
@@ -254,13 +254,13 @@ void gen_type(Type *t, char *name)
 
     switch (bt->tag) {
     case T_EVFLAG:
-        gen_code("evflag ");
+        gen_code("evflag");
         break;
     case T_PRIM:
-        gen_code("%s ", prim_type_name[bt->val.prim]);
+        gen_code("%s", prim_type_name[bt->val.prim]);
         break;
     case T_FOREIGN:
-        gen_code("%s%s ", foreign_type_prefix[bt->val.foreign.tag], bt->val.foreign.name);
+        gen_code("%s%s", foreign_type_prefix[bt->val.foreign.tag], bt->val.foreign.name);
         break;
     default:
         assert(impossible);
diff --git a/test/validate/sizeof.st b/test/validate/sizeof.st
index 3b410c3ba63fc0550013532a91051fd8e2e5219c..07f0e3ccac58fbae13cdce58670a9a3a061eedce 100644
--- a/test/validate/sizeof.st
+++ b/test/validate/sizeof.st
@@ -16,7 +16,7 @@ ss test {
     state sizes {
         when () {
             char c;
-            char *p;
+            char *p = &c;
             testOk1(sizeof(char)==1);
             testOk1(sizeof(*p)==1);
             c = *p;