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;