|
|
@@ -390,6 +390,12 @@ PROCEDURE FormalOk (a, b: TypeIndex): BOOLEAN;
|
|
|
IF IsOpenArray(a) AND IsOpenArray(b) THEN
|
|
|
RETURN SameType(ArrayElem(a), ArrayElem(b))
|
|
|
END;
|
|
|
+ (* Procedure types are built fresh per parse, so a
|
|
|
+ DEFINITION/IMPLEMENTATION pair never shares the index; compare
|
|
|
+ structurally (same result and parameter types). *)
|
|
|
+ IF (tform[Resolve(a)] = FProc) AND (tform[Resolve(b)] = FProc) THEN
|
|
|
+ RETURN ProcTypesOk(Resolve(a), Resolve(b))
|
|
|
+ END;
|
|
|
RETURN StrCompat(a, b)
|
|
|
END FormalOk;
|
|
|
|
|
|
@@ -2806,7 +2812,7 @@ PROCEDURE ArithCheck (l, r: TypeIndex; divmod: BOOLEAN;
|
|
|
VAR res: TypeIndex): BOOLEAN;
|
|
|
BEGIN
|
|
|
res := InvalidType;
|
|
|
- IF (l = InvalidType) OR (r = InvalidType) THEN RETURN TRUE END;
|
|
|
+ IF (Resolve(l) = InvalidType) OR (Resolve(r) = InvalidType) THEN RETURN TRUE END;
|
|
|
IF (IsLongFamily(l) AND IsLongFamily(r))
|
|
|
OR (IsLongFamily(l) AND IsIntFamily(r))
|
|
|
OR (IsIntFamily(l) AND IsLongFamily(r)) THEN
|
|
|
@@ -2823,7 +2829,7 @@ PROCEDURE ArithCheck (l, r: TypeIndex; divmod: BOOLEAN;
|
|
|
|
|
|
PROCEDURE BoolCheck (t: TypeIndex): BOOLEAN;
|
|
|
BEGIN
|
|
|
- IF t = InvalidType THEN RETURN TRUE END;
|
|
|
+ IF Resolve(t) = InvalidType THEN RETURN TRUE END;
|
|
|
RETURN ClassOf(t) = ClBool
|
|
|
END BoolCheck;
|
|
|
|
|
|
@@ -2869,7 +2875,7 @@ PROCEDURE StrCompat (l, r: TypeIndex): BOOLEAN;
|
|
|
PROCEDURE EqCheck (l, r: TypeIndex): BOOLEAN;
|
|
|
VAR rl, rr: TypeIndex;
|
|
|
BEGIN
|
|
|
- IF (l = InvalidType) OR (r = InvalidType) THEN RETURN TRUE END;
|
|
|
+ IF (Resolve(l) = InvalidType) OR (Resolve(r) = InvalidType) THEN RETURN TRUE END;
|
|
|
IF ClassOf(l) = ClNil THEN
|
|
|
RETURN (ClassOf(r) = ClNil) OR (ClassOf(r) = ClPtr)
|
|
|
END;
|
|
|
@@ -2915,7 +2921,7 @@ PROCEDURE EqCheck (l, r: TypeIndex): BOOLEAN;
|
|
|
|
|
|
PROCEDURE OrdCheck (l, r: TypeIndex): BOOLEAN;
|
|
|
BEGIN
|
|
|
- IF (l = InvalidType) OR (r = InvalidType) THEN RETURN TRUE END;
|
|
|
+ IF (Resolve(l) = InvalidType) OR (Resolve(r) = InvalidType) THEN RETURN TRUE END;
|
|
|
IF IsIntFamily(l) AND IsIntFamily(r) THEN RETURN TRUE END;
|
|
|
IF (ClassOf(l) = ClLong) AND (ClassOf(r) = ClLong) THEN
|
|
|
RETURN TRUE
|
|
|
@@ -2945,7 +2951,7 @@ PROCEDURE SetElemClassOk (c: INTEGER): BOOLEAN;
|
|
|
PROCEDURE InCheck (l, set: TypeIndex): BOOLEAN;
|
|
|
VAR rs, b: TypeIndex;
|
|
|
BEGIN
|
|
|
- IF (l = InvalidType) OR (set = InvalidType) THEN RETURN TRUE END;
|
|
|
+ IF (Resolve(l) = InvalidType) OR (Resolve(set) = InvalidType) THEN RETURN TRUE END;
|
|
|
rs := Resolve(set);
|
|
|
IF (rs = InvalidType) OR (tform[rs] # FSet) THEN RETURN FALSE END;
|
|
|
b := tref[rs];
|
|
|
@@ -2966,7 +2972,7 @@ PROCEDURE InCheck (l, set: TypeIndex): BOOLEAN;
|
|
|
|
|
|
PROCEDURE RelCheck (l, r: TypeIndex; op: INTEGER): BOOLEAN;
|
|
|
BEGIN
|
|
|
- IF (l = InvalidType) OR (r = InvalidType) THEN RETURN TRUE END;
|
|
|
+ IF (Resolve(l) = InvalidType) OR (Resolve(r) = InvalidType) THEN RETURN TRUE END;
|
|
|
IF op = OpIn THEN RETURN InCheck(l, r) END;
|
|
|
IF (op = OpEq) OR (op = OpNeq1) OR (op = OpNeq2) THEN
|
|
|
RETURN EqCheck(l, r)
|