diff --git a/src/oberon.c b/src/oberon.c
index 4a740d8130db2be573d6c197eadc2ee767244d3c..1b7f5d9b19315aa614ef96e1665f21c11054da9b 100644 (file)
--- a/src/oberon.c
+++ b/src/oberon.c
@@ -1088,6 +1088,12 @@ oberon_cast_expr(oberon_context_t * ctx, oberon_expr_t * expr, oberon_type_t * p
cast = oberon_new_item(MODE_CHAR, ctx -> char_type, true);
cast -> item.integer = expr -> item.string[0];
}
+ else if(oberon_is_record_type(pref) || oberon_is_pointer_to_record(pref))
+ {
+ assert(expr -> is_item);
+ cast = oberon_new_item(MODE_AS, pref, expr -> read_only);
+ cast -> item.parent = (oberon_item_t *) expr;
+ }
else if(!oberon_is_some_types(expr -> result, pref))
{
cast = oberon_new_operator(OP_CAST, pref, expr, NULL);
@@ -1995,7 +2001,7 @@ oberon_make_bin_op(oberon_context_t * ctx, int token, oberon_expr_t * a, oberon_
expr = oberon_new_operator(OP_DIV, result, a, b);
break;
case MOD:
- expr = oberon_new_operator(OP_DIV, result, a, b);
+ expr = oberon_new_operator(OP_MOD, result, a, b);
break;
default:
printf("token %i line %i\n", token, ctx -> loc.line);
oberon_error(ctx, "condition must be boolean");
}
- oberon_generate_branch(ctx, cond, true, begin);
+ oberon_generate_branch(ctx, cond, false, begin);
}
else if(ctx -> token == FOR)
{
@@ -3940,7 +3946,6 @@ oberon_make_inc_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_
{
step = list_args -> next;
oberon_check_src(ctx, step);
- oberon_check_const(ctx, step);
if(!oberon_is_integer_type(step -> result))
{
oberon_error(ctx, "expect integer");
@@ -4055,7 +4060,6 @@ oberon_make_dec_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_
{
step = list_args -> next;
oberon_check_src(ctx, step);
- oberon_check_const(ctx, step);
if(!oberon_is_integer_type(step -> result))
{
oberon_error(ctx, "expect integer");