Added a kind of range-check for assignments between cards and ints
This commit is contained in:
parent
c839c01680
commit
befe7be9de
2 changed files with 43 additions and 4 deletions
|
@ -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)
|
||||
|
|
|
@ -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;)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue