some more fixes
authorceriel <none@none>
Wed, 22 Jul 1987 10:59:24 +0000 (10:59 +0000)
committerceriel <none@none>
Wed, 22 Jul 1987 10:59:24 +0000 (10:59 +0000)
lang/m2/comp/Makefile
lang/m2/comp/Version.c
lang/m2/comp/code.c
lang/m2/comp/declar.g
lang/m2/comp/enter.c
lang/m2/comp/type.c
lang/m2/comp/walk.c

index 904dbbe..13df19b 100644 (file)
@@ -239,6 +239,7 @@ enter.o: LLlex.h
 enter.o: debug.h
 enter.o: debugcst.h
 enter.o: def.h
+enter.o: f_info.h
 enter.o: idf.h
 enter.o: main.h
 enter.o: misc.h
index 5fbfc39..77b2f41 100644 (file)
@@ -1 +1 @@
-static char Version[] = "ACK Modula-2 compiler Version 0.12";
+static char Version[] = "ACK Modula-2 compiler Version 0.13";
index 0c83f70..0e189f2 100644 (file)
@@ -132,7 +132,6 @@ CodeExpr(nd, ds, true_label, false_label)
                ds->dsg_kind = DSG_LOADED;
                break;
 
-       case Xset:
        case Set: {
                register unsigned i = (unsigned) (tp->tp_size) / (int) word_size;
                register arith *st = nd->nd_set + i;
@@ -397,8 +396,14 @@ CodeParameters(param, arg)
                if (left->nd_symb == STRING) {
                        CodeString(left);
                }
-               else if (left->nd_class == Call || left->nd_class == Value) {
-                       /* ouch! forgot about these ones! */
+               else switch(left->nd_class) {
+               case Arrsel:
+               case Arrow:
+               case Def:
+               case LinkDef:
+                       CodeDAddress(left);
+                       break;
+               default:{
                        arith tmp, TmpSpace();
 
                        CodePExpr(left);
@@ -406,8 +411,9 @@ CodeParameters(param, arg)
                        C_lal(tmp);
                        C_sti(WA(left->nd_type->tp_size));
                        C_lal(tmp);
+                       }
+                       break;
                }
-               else    CodeDAddress(left);
                return;
        }
        if (IsVarParam(param)) {
index 51c5b2e..d6f89c3 100644 (file)
@@ -414,6 +414,7 @@ SetType(struct type **ptp;) :
        type-identifiers
 */
 PointerType(register struct type **ptp;) :
+                       { *ptp = construct_type(T_POINTER, NULLTYPE); }
        POINTER TO
        [ %if   (type_or_forward(ptp))
          type(&((*ptp)->tp_next)) 
index d8d7f46..1f09397 100644 (file)
@@ -25,6 +25,7 @@
 #include       "node.h"
 #include       "main.h"
 #include       "misc.h"
+#include       "f_info.h"
 
 struct def *
 Enter(name, kind, type, pnam)
@@ -463,12 +464,16 @@ EnterImportList(Idlist, local)
        register struct node *idlist = Idlist;
        struct scope *sc = enclosing(CurrVis)->sc_scope;
        extern struct def *GetDefinitionModule();
+       struct f_info f;
+       
+       f = file_info;
 
        for (; idlist; idlist = idlist->nd_left) {
                DoImport(local ?
                                ForwDef(idlist, sc) :
                                GetDefinitionModule(idlist->nd_IDF, 1) ,
                         CurrentScope);
+               file_info = f;
        }
        FreeNode(Idlist);
 }
index b4289d4..810f636 100644 (file)
@@ -590,7 +590,6 @@ type_or_forward(ptp)
        register struct node *nd;
        register struct def *df1;
 
-       *ptp = construct_type(T_POINTER, NULLTYPE);
        if ((df1 = lookup(dot.TOK_IDF, CurrentScope, 1))) {
                /* Either a Module or a Type, but in both cases defined
                   in this scope, so this is the correct identification
index edf1846..73bf05e 100644 (file)
@@ -574,6 +574,7 @@ node_error(right, "type incompatibility in RETURN statement");
                                CodePString(right, func_type);
                        }
                        else    CodePExpr(right);
+                       RangeCheck(func_type, right->nd_type);
                }
                C_bra(RETURN_LABEL);
                break;