Răsfoiți Sursa

Variable check for receiver

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7025 8c9fc860-2736-0410-a75d-ab315db34111
felixf 8 ani în urmă
părinte
comite
4a3c451f48

+ 0 - 2
source/FoxIntermediateBackend.Mod

@@ -9498,8 +9498,6 @@ TYPE
 					END;
 				END;
 			ELSIF (x.kind = SyntaxTree.VarParameter) OR (x.kind = SyntaxTree.ConstParameter) & (type IS SyntaxTree.RecordType) THEN
-			
-				IF x.selfParameter THEN TRACE(x, x.offsetInBits) END;
 				IntermediateCode.AddOffset(result.op,ToMemoryUnits(system,x.offsetInBits));
 				IntermediateCode.MakeMemory(result.op,addressType);
 			ELSIF (x.kind = SyntaxTree.ValueParameter) OR (x.kind = SyntaxTree.ConstParameter) THEN

+ 7 - 1
source/FoxSemanticChecker.Mod

@@ -4604,6 +4604,7 @@ TYPE
 			formalParameter: SyntaxTree.Parameter;
 			actualParameter: SyntaxTree.Expression;
 			i: LONGINT;
+			self: SyntaxTree.Expression;
 		BEGIN
 			IF Trace THEN D.Str("ProcedureCallDesignator"); D.Ln; END;
 			result := SyntaxTree.invalidDesignator;
@@ -4615,7 +4616,12 @@ TYPE
 				Error(position, "forbidden call of non-realtime procedure in realtime block");
 			END;
 			
-			
+			IF (formalType.selfParameter # NIL) & (formalType.selfParameter.kind = SyntaxTree.VarParameter) THEN
+				self := left.left;
+				IF (self # NIL) & ~IsVariable(self) THEN
+					Error(self.position, "Non-variable expression on variable receiver");
+				END;
+			END;
 			
 			IF ~ExpressionList(actualParameters) THEN
 				result := SyntaxTree.invalidDesignator

+ 3 - 3
source/FoxSyntaxTree.Mod

@@ -1843,12 +1843,12 @@ TYPE
 					result := result & (callingConvention = this.callingConvention);
 					result := result & (noReturn = this.noReturn);
 					IF result THEN
-						(*
+						
 						p1 := selfParameter; p2 := this.selfParameter;
-						IF (p1 = NIL) # (p2=NIL) OR (p1 # NIL) & ((p1.access # p2.access) OR (p1.kind # p2.kind) OR ~p1.type.SameType(p2.type)) THEN
+						IF (p1 = NIL) # (p2=NIL) OR (p1 # NIL) & ((p1.kind # p2.kind)) THEN
 							RETURN FALSE
 						END;
-						*)
+						
 						p1 := firstParameter; p2 := this.firstParameter;
 						WHILE (p1 # NIL) & (p2 # NIL) & (p1.access # Hidden) & (p2.access # Hidden) & (p1.kind = p2.kind) & (p1.type.SameType(p2.type) OR (p2.type.resolved # NIL) & p1.type.SameType(p2.type.resolved) OR (p1.type.resolved IS AddressType) & (p2.type.resolved IS PointerType) & p2.type.resolved(PointerType).isUnsafe) DO
 							p1 := p1.nextParameter; p2 := p2.nextParameter