MODULE Test;
TYPE
- Rider = RECORD i : INTEGER END;
+ Stream* = POINTER TO Handle;
+ Handle = RECORD END;
-PROCEDURE X;
- VAR
- r : Rider;
+ Writer* = RECORD END;
+
+ Printer* = RECORD (Writer) END;
+
+VAR
+ s : Stream;
+ o : Writer;
+ out : Printer;
+
+PROCEDURE SetStream(VAR w : Writer; stream : Stream);
BEGIN
- r.i := 666;
-END X;
+END SetStream;
BEGIN
- X;
+ SetStream(o, s);
+ SetStream(out, s);
END Test.
maketest Test20
maketest Test21
maketest Test22
+
+makecomp Test23A
+makefail Test23B
size_t len = strlen(fname);
res -> source = malloc(len + 1);
- memcpy(res -> source, fname, len);
+ memcpy(res -> source, fname, len + 1);
return fp;
}
/* фактический параметр может быть указателем любого типа. */
return oberon_is_some_types(Tf, Ta)
- || (oberon_is_record_type(Tf) && oberon_extension_of(Ta, Tf))
+ || (oberon_is_record_type(Tf) && oberon_extension_of(Tf, Ta))
|| (oberon_is_system_byte_type(Tf) && (oberon_is_char_type(Ta) || oberon_is_byte_type(Ta)))
|| (oberon_is_array_of_system_byte_type(Tf))
|| (oberon_is_system_ptr_type(Tf));
}
else
{
- expr = oberon_cast_expr(ctx, arg, ctx -> int_type);
+ expr = oberon_cast_expr(ctx, arg, ctx -> shortint_type);
}
return expr;
}
--- /dev/null
+MODULE Test23A;
+
+TYPE
+ Stream* = POINTER TO Handle;
+ Handle = RECORD END;
+
+ Writer* = RECORD END;
+
+ Printer* = RECORD (Writer) END;
+
+VAR
+ s : Stream;
+ o : Writer;
+ out : Printer;
+
+PROCEDURE SetStream(VAR w : Writer; stream : Stream);
+BEGIN
+END SetStream;
+
+BEGIN
+ SetStream(o, s);
+ SetStream(out, s);
+END Test23A.
+
+Проверка VAR-параметров-записи. Должно компилироваться.
--- /dev/null
+MODULE Test23B;
+
+TYPE
+ Stream* = POINTER TO Handle;
+ Handle = RECORD END;
+
+ Writer* = RECORD END;
+
+ Printer* = RECORD (Writer) END;
+
+VAR
+ s : Stream;
+ o : Writer;
+ out : Printer;
+
+PROCEDURE SetStream(VAR w : Writer; stream : Stream);
+BEGIN
+END SetStream;
+
+BEGIN
+ SetStream(s, s);
+END Test23B.
+
+Проверка VAR-параметров-записи. Должно проваливаться.