DEADSOFTWARE

Исправлено обращение к полям при использовании каста. Процедуры INC/DEC больше не...
[dsw-obn.git] / src / oberon.c
index 4a740d8130db2be573d6c197eadc2ee767244d3c..1b7f5d9b19315aa614ef96e1665f21c11054da9b 100644 (file)
@@ -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);
@@ -3495,7 +3501,7 @@ oberon_statement(oberon_context_t * ctx)
                        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");