Added a kind of range-check for assignments between cards and ints
authorceriel <none@none>
Thu, 18 Jun 1987 17:42:47 +0000 (17:42 +0000)
committerceriel <none@none>
Thu, 18 Jun 1987 17:42:47 +0000 (17:42 +0000)
lang/m2/comp/code.c
lang/m2/comp/declar.g

index a620468..f2e846a 100644 (file)
@@ -17,6 +17,7 @@
 #include       <em_arith.h>
 #include       <em_label.h>
 #include       <em_code.h>
+#include       <em_abs.h>
 #include       <assert.h>
 
 #include       "type.h"
@@ -396,7 +397,7 @@ CodeParameters(param, arg)
                return;
        }
        CodePExpr(left);
-       CodeCheckExpr(left, tp);
+       CodeCheckExpr(left_type, tp);
 }
 
 CodeCheckExpr(tp1, tp2)
@@ -586,6 +587,18 @@ RangeCheck(tpl, tpr)
                        }
                }
        }
+       else if (tpl->tp_size <= tpr->tp_size &&
+                ((tpl->tp_fund == T_INTEGER && tpr == card_type) ||
+                 (tpr->tp_fund == T_INTEGER && tpl == card_type))) {
+               label lb = ++text_label;
+
+               C_dup(word_size);
+               C_zge(lb);
+               C_loc((arith) ECONV);
+               C_trp();
+               C_df_ilb(lb);
+       }
+
 }
 
 Operands(leftop, rightop, tp)
index ff256dc..0f235d7 100644 (file)
@@ -35,6 +35,7 @@ int           return_occurred;        /* set if a return occurs in a block */
 
 }
 
+/* inline in declaration: need space
 ProcedureDeclaration
 {
        struct def *df;
@@ -47,6 +48,7 @@ ProcedureDeclaration
                                --proclevel;
                        }
 ;
+*/
 
 ProcedureHeading(struct def **pdf; int type;)
 {
@@ -56,7 +58,18 @@ ProcedureHeading(struct def **pdf; int type;)
 } :
        PROCEDURE IDENT
                        { *pdf = DeclProc(type, dot.TOK_IDF); }
-       FormalParameters(&pr, &parmaddr, &tp)?
+       [
+               '('
+               [
+                       FPSection(&pr, &parmaddr)
+                       [
+                               ';' FPSection(&pr, &parmaddr)
+                       ]*
+               ]?
+               ')'
+               [       ':' qualtype(&tp)
+               ]?
+       ]?
                        { CheckWithDef(*pdf, proc_type(tp, pr, parmaddr));
                          if (tp && IsConstructed(tp)) {
 warning(W_STRICT, "procedure \"%s\" has a constructed result type",
@@ -77,18 +90,30 @@ block(struct node **pnd;) :
        END
 ;
 
-declaration:
+declaration
+{
+       struct def *df;
+} :
        CONST [ ConstantDeclaration ';' ]*
 |
        TYPE [ TypeDeclaration ';' ]*
 |
        VAR [ VariableDeclaration ';' ]*
 |
-       ProcedureDeclaration ';'
+                       {       ++proclevel; }
+       ProcedureHeading(&df, D_PROCEDURE)
+       ';'
+       block(&(df->prc_body))
+       IDENT
+                       {       EndProc(df, dot.TOK_IDF);
+                               --proclevel;
+                       }
+       ';'
 |
        ModuleDeclaration ';'
 ;
 
+/* inline in procedureheading: need space
 FormalParameters(struct paramlist **ppr; arith *parmaddr; struct type **ptp;):
        '('
        [
@@ -101,6 +126,7 @@ FormalParameters(struct paramlist **ppr; arith *parmaddr; struct type **ptp;):
        [       ':' qualtype(ptp)
        ]?
 ;
+*/
 
 FPSection(struct paramlist **ppr; arith *parmaddr;)
 {