diff --git a/src/oberon.c b/src/oberon.c
index 0118ff9bfceded3989c464ed1a6f9fb59645a6be..6aa94d602fd9da13bb67174ecf2dc6632f9c2d4a 100644 (file)
--- a/src/oberon.c
+++ b/src/oberon.c
@@ -1159,7 +1159,8 @@ oberon_make_record_selector(oberon_context_t * ctx, oberon_expr_t * expr, char *
#define ISSELECTOR(x) \
(((x) == LBRACE) \
|| ((x) == DOT) \
- || ((x) == UPARROW))
+ || ((x) == UPARROW) \
+ || ((x) == LPAREN))
static oberon_object_t *
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)
{
oberon_assert_token(ctx, UPARROW);
expr = oberno_make_dereferencing(ctx, expr);
break;
+ case LPAREN:
+ oberon_assert_token(ctx, LPAREN);
+ oberon_object_t * objtype = oberon_qualident(ctx, NULL, 1);
+ if(objtype -> class != OBERON_CLASS_TYPE)
+ {
+ oberon_error(ctx, "must be type");
+ }
+ oberon_assert_token(ctx, RPAREN);
+ expr = oberno_make_record_cast(ctx, expr, objtype -> type);
+ break;
default:
oberon_error(ctx, "oberon_designator: wat");
break;