X-Git-Url: http://deadsoftware.ru/gitweb?p=dsw-obn.git;a=blobdiff_plain;f=src%2Foberon.c;h=cefd46928194b60c17099c25211692000f067ff4;hp=6aa94d602fd9da13bb67174ecf2dc6632f9c2d4a;hb=56540110475558bb4cb3d1dad559f9050b35e80f;hpb=5eab721345c3e472bbfbb97645729069b0b6bb40 diff --git a/src/oberon.c b/src/oberon.c index 6aa94d6..cefd469 100644 --- a/src/oberon.c +++ b/src/oberon.c @@ -767,6 +767,18 @@ oberon_cast_expr(oberon_context_t * ctx, oberon_expr_t * expr, oberon_type_t * p return cast; } +static oberon_expr_t * +oberno_make_record_cast(oberon_context_t * ctx, oberon_expr_t * expr, oberon_type_t * rec) +{ + if(expr -> result -> class != OBERON_TYPE_RECORD + || rec -> class != OBERON_TYPE_RECORD) + { + oberon_error(ctx, "must be record type"); + } + + return oberon_cast_expr(ctx, expr, rec); +} + static oberon_type_t * oberon_get_equal_expr_type(oberon_context_t * ctx, oberon_type_t * a, oberon_type_t * b) { @@ -841,11 +853,20 @@ oberon_autocast_to(oberon_context_t * ctx, oberon_expr_t * expr, oberon_type_t * } else if(pref -> class == OBERON_TYPE_RECORD) { - if(expr -> result != pref) + oberon_type_t * t = expr -> result; + while(t != NULL && t != pref) + { + t = t -> base; + } + if(t == NULL) { printf("oberon_autocast_to: rec %p != %p\n", expr -> result, pref); oberon_error(ctx, "incompatible record types"); } + if(expr -> result != pref) + { + expr = oberno_make_record_cast(ctx, expr, pref); + } } else if(pref -> class == OBERON_TYPE_POINTER) { @@ -1195,18 +1216,6 @@ oberon_qualident(oberon_context_t * ctx, char ** xname, int check) return x; } -static oberon_expr_t * -oberno_make_record_cast(oberon_context_t * ctx, oberon_expr_t * expr, oberon_type_t * rec) -{ - if(expr -> result -> class != OBERON_TYPE_RECORD - || rec -> class != OBERON_TYPE_RECORD) - { - oberon_error(ctx, "must be record type"); - } - - return oberon_cast_expr(ctx, expr, rec); -} - static oberon_expr_t * oberon_designator(oberon_context_t * ctx) {