diff --git a/src/oberon.c b/src/oberon.c
index a2a567036598a90f005bcc1780531e18e6d54701..e88ff79159e28e93c010a73ebde045ee8a6c9132 100644 (file)
--- a/src/oberon.c
+++ b/src/oberon.c
@@ -1720,7 +1720,45 @@ oberon_make_bin_op(oberon_context_t * ctx, int token, oberon_expr_t * a, oberon_
oberon_expr_t * expr;
oberon_type_t * result;
- if(ITMAKESBOOLEAN(token))
+ if(token == IS)
+ {
+ oberon_type_t * v = a -> result;
+ if(v -> class == OBERON_TYPE_POINTER)
+ {
+ v = v -> base;
+ if(v -> class != OBERON_TYPE_RECORD)
+ {
+ oberon_error(ctx, "must be record");
+ }
+ }
+ else if(v -> class != OBERON_TYPE_RECORD)
+ {
+ oberon_error(ctx, "must be record");
+ }
+
+ if(b -> is_item == false || b -> item.mode != MODE_TYPE)
+ {
+ oberon_error(ctx, "requires type");
+ }
+
+ oberon_type_t * t = b -> result;
+ if(t -> class == OBERON_TYPE_POINTER)
+ {
+ t = t -> base;
+ if(t -> class != OBERON_TYPE_RECORD)
+ {
+ oberon_error(ctx, "must be record");
+ }
+ }
+ else if(t -> class != OBERON_TYPE_RECORD)
+ {
+ oberon_error(ctx, "must be record");
+ }
+
+ result = ctx -> bool_type;
+ expr = oberon_new_operator(OP_IS, result, a, b);
+ }
+ else if(ITMAKESBOOLEAN(token))
{
if(ITUSEONLYINTEGER(token))
{
@@ -3501,6 +3539,7 @@ oberon_make_abs_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_
oberon_expr_t * arg;
arg = list_args;
+ oberon_check_src(ctx, arg);
oberon_type_t * result_type;
result_type = arg -> result;
@@ -3523,8 +3562,10 @@ oberon_make_new_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_
oberon_error(ctx, "too few arguments");
}
+
oberon_expr_t * dst;
dst = list_args;
+ oberon_check_dst(ctx, dst);
oberon_type_t * type;
type = dst -> result;
@@ -3573,6 +3614,7 @@ oberon_make_new_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_
oberon_expr_t * arg = size_list;
for(int i = 0; i < max_args - 1; i++)
{
+ oberon_check_src(ctx, arg);
if(arg -> result -> class != OBERON_TYPE_INTEGER)
{
oberon_error(ctx, "size must be integer");