DEADSOFTWARE

Фиксы проверки типов
authorDeaDDooMER <deaddoomer@deadsoftware.ru>
Fri, 18 Aug 2017 16:27:54 +0000 (19:27 +0300)
committerDeaDDooMER <deaddoomer@deadsoftware.ru>
Fri, 18 Aug 2017 16:27:54 +0000 (19:27 +0300)
Test.obn
src/oberon-type-compat.c
src/oberon.c

index 67a35e4ef616fb5f76e91b2f1cf9a5b60eb0ffbc..f47edbbb416fd2154a0f16c7bfbaf310923269bc 100644 (file)
--- a/Test.obn
+++ b/Test.obn
@@ -1,14 +1,23 @@
 MODULE Test;
 
-IMPORT Out;
+IMPORT Files;
+
+TYPE
+  String = POINTER TO ARRAY OF CHAR;
+  R* = RECORD ch : CHAR END;
+
+VAR
+  f : Files.File;
+  r : Files.Rider;
+  m : R;
+  s : String;
 
 BEGIN
-  Out.String("A");
-  Out.Char("A");
-  Out.Ln;
-  ASSERT("A" = 041X);
-  ASSERT(041X = "A");
-  ASSERT(ORD("A") = 041H);
-  ASSERT(041H = ORD("A"));
-  ASSERT("A" = "A");
+  f := Files.Old("Test.obn");
+  ASSERT(f # NIL);
+  Files.Set(r, f, 0);
+
+  Files.Read(r, m.ch);
+
+  ASSERT(s = NIL);
 END Test.
index 3da62edc2bb5b059b7ee20b90f20c238400de495..a30849986c45fa9d2054587864c280b9e7a5cc23 100644 (file)
@@ -302,7 +302,7 @@ oberon_is_assignment_compatible_expressions(oberon_expr_t * e, oberon_type_t * T
        /*      совпадают с параметрами Tv. */
        /* Доп: Tv - символ, е - строковая константа из одного символа */
 
-       /* SYSTEM: Ð¿еременным типа BYTE можно присваивать значения переменных типа CHAR или SHORTINT. */
+       /* SYSTEM: Ð\9fеременным типа BYTE можно присваивать значения переменных типа CHAR или SHORTINT. */
        /* SYSTEM: Переменным типа PTR могут быть присвоены значения переменных-указателей любого типа. */
 
        oberon_type_t * Te = e -> result;
@@ -422,8 +422,8 @@ oberon_is_compatible_bin_expr_types(int token, oberon_type_t * a, oberon_type_t
                {
                        return true;
                }
-               else if((oberon_is_nil_type(a) || oberon_is_pointer_to_record(a) || oberon_is_procedure_type(a))
-                       && (oberon_is_nil_type(b) || oberon_is_pointer_to_record(b) || oberon_is_procedure_type(b)))
+               else if((oberon_is_nil_type(a) || oberon_is_pointer_type(a) || oberon_is_procedure_type(a))
+                       && (oberon_is_nil_type(b) || oberon_is_pointer_type(b) || oberon_is_procedure_type(b)))
                {
                        return true;
                }
@@ -477,6 +477,7 @@ oberon_is_compatible_var_param(oberon_type_t * Tf, oberon_type_t * Ta)
 
        return oberon_is_some_types(Tf, Ta)
                || (oberon_is_record_type(Tf) && oberon_extension_of(Ta, Tf))
+               || (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));
 }
index 04d4c6d75a736a8e1d1f57e909ba6d509775fcf4..29c40cb974b5a822bb89c18cfe567a2d464aa966 100644 (file)
@@ -3156,7 +3156,7 @@ oberon_case_labels(oberon_context_t * ctx, oberon_expr_t * val)
        oberon_expr_t * cond2;
 
        e1 = (oberon_expr_t *) oberon_const_expr(ctx);
-       
+
        e2 = NULL;
        if(ctx -> token == DOTDOT)
        {