fix: variable sets were handled wrong

This commit is contained in:
ceriel 1987-08-03 18:20:55 +00:00
parent 3883f47fd0
commit 956fa21b89
2 changed files with 20 additions and 5 deletions

View file

@ -425,11 +425,12 @@ ChkSet(expp)
register struct def *df;
unsigned size;
int retval = 1;
int SetIsConstant = 1;
assert(expp->nd_symb == SET);
expp->nd_class = Set;
expp->nd_type = error_type;
expp->nd_class = Set;
/* First determine the type of the set
*/
@ -472,10 +473,11 @@ ChkSet(expp)
expp->nd_set)) {
retval = 0;
}
if (nd->nd_left) SetIsConstant = 0;
nd = nd->nd_right;
}
if (expp->nd_class == Set) {
if (SetIsConstant) {
FreeNode(expp->nd_right);
expp->nd_right = 0;
}

View file

@ -57,12 +57,21 @@ statement(register struct node **pnd;)
|
CaseStatement(pnd)
|
WhileStatement(pnd)
WHILE { *pnd = nd = MkLeaf(Stat, &dot); }
expression(&(nd->nd_left))
DO
StatementSequence(&(nd->nd_right))
END
|
RepeatStatement(pnd)
REPEAT { *pnd = nd = MkLeaf(Stat, &dot); }
StatementSequence(&(nd->nd_left))
UNTIL
expression(&(nd->nd_right))
|
{ loopcount++; }
LoopStatement(pnd)
LOOP { *pnd = nd = MkLeaf(Stat, &dot); }
StatementSequence(&((*pnd)->nd_right))
END
{ loopcount--; }
|
ForStatement(pnd)
@ -176,6 +185,7 @@ case(struct node **pnd; struct type **ptp;) :
}
;
/* inline in statement; lack of space
WhileStatement(struct node **pnd;)
{
register struct node *nd;
@ -196,6 +206,7 @@ RepeatStatement(struct node **pnd;)
UNTIL
expression(&(nd->nd_right))
;
*/
ForStatement(struct node **pnd;)
{
@ -225,11 +236,13 @@ ForStatement(struct node **pnd;)
END
;
/* inline in Statement; lack of space
LoopStatement(struct node **pnd;):
LOOP { *pnd = MkLeaf(Stat, &dot); }
StatementSequence(&((*pnd)->nd_right))
END
;
*/
WithStatement(struct node **pnd;)
{