|
@@ -9696,7 +9696,8 @@ begin
|
|
if DeclEl is TPasProcedure then
|
|
if DeclEl is TPasProcedure then
|
|
begin
|
|
begin
|
|
Proc:=TPasProcedure(DeclEl);
|
|
Proc:=TPasProcedure(DeclEl);
|
|
- if (Access=rraAssign) and (Proc.ProcType is TPasFunctionType)
|
|
|
|
|
|
+ if (Access=rraAssign)
|
|
|
|
+ and (Proc.ProcType is TPasFunctionType)
|
|
and (Params.Parent.ClassType=TPasImplAssign)
|
|
and (Params.Parent.ClassType=TPasImplAssign)
|
|
and (TPasImplAssign(Params.Parent).left=Params) then
|
|
and (TPasImplAssign(Params.Parent).left=Params) then
|
|
begin
|
|
begin
|
|
@@ -9712,6 +9713,7 @@ begin
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
+
|
|
ComputeElement(NameExpr,ResolvedEl,[rcSetReferenceFlags]);
|
|
ComputeElement(NameExpr,ResolvedEl,[rcSetReferenceFlags]);
|
|
{$IFDEF VerbosePasResolver}
|
|
{$IFDEF VerbosePasResolver}
|
|
writeln('TPasResolver.ResolveArrayParamsExprName NameExp=',GetObjName(NameExpr),' ',GetResolverResultDbg(ResolvedEl));
|
|
writeln('TPasResolver.ResolveArrayParamsExprName NameExp=',GetObjName(NameExpr),' ',GetResolverResultDbg(ResolvedEl));
|
|
@@ -9722,11 +9724,33 @@ end;
|
|
procedure TPasResolver.ResolveArrayParamsArgs(Params: TParamsExpr;
|
|
procedure TPasResolver.ResolveArrayParamsArgs(Params: TParamsExpr;
|
|
const ResolvedValue: TPasResolverResult; Access: TResolvedRefAccess);
|
|
const ResolvedValue: TPasResolverResult; Access: TResolvedRefAccess);
|
|
|
|
|
|
|
|
+ procedure ReadAccessParamValue;
|
|
|
|
+ var
|
|
|
|
+ Left: TPasExpr;
|
|
|
|
+ Ref: TResolvedReference;
|
|
|
|
+ begin
|
|
|
|
+ if Access=rraAssign then
|
|
|
|
+ begin
|
|
|
|
+ // ArrayStringPointer[]:=
|
|
|
|
+ // -> writing the element needs reading the value
|
|
|
|
+ Left:=Params.Value;
|
|
|
|
+ if (Left is TBinaryExpr) and (TBinaryExpr(Left).OpCode=eopSubIdent) then
|
|
|
|
+ Left:=TBinaryExpr(Left).right;
|
|
|
|
+ if Left.CustomData is TResolvedReference then
|
|
|
|
+ begin
|
|
|
|
+ Ref:=TResolvedReference(Left.CustomData);
|
|
|
|
+ if Ref.Access=rraAssign then
|
|
|
|
+ Ref.Access:=rraReadAndAssign;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+
|
|
function CheckStringOrPointerIndex(IsStringIndex: boolean): boolean;
|
|
function CheckStringOrPointerIndex(IsStringIndex: boolean): boolean;
|
|
var
|
|
var
|
|
ArgExp: TPasExpr;
|
|
ArgExp: TPasExpr;
|
|
ResolvedArg: TPasResolverResult;
|
|
ResolvedArg: TPasResolverResult;
|
|
begin
|
|
begin
|
|
|
|
+ ReadAccessParamValue;
|
|
if not IsStringIndex then
|
|
if not IsStringIndex then
|
|
begin
|
|
begin
|
|
// pointer
|
|
// pointer
|
|
@@ -9795,6 +9819,7 @@ begin
|
|
if ResolvedValue.IdentEl is TPasType then
|
|
if ResolvedValue.IdentEl is TPasType then
|
|
RaiseMsg(20170216152215,nIllegalQualifierAfter,sIllegalQualifierAfter,
|
|
RaiseMsg(20170216152215,nIllegalQualifierAfter,sIllegalQualifierAfter,
|
|
['[',ResolvedValue.IdentEl.ElementTypeName],Params);
|
|
['[',ResolvedValue.IdentEl.ElementTypeName],Params);
|
|
|
|
+ ReadAccessParamValue;
|
|
CheckCallArrayCompatibility(TPasArrayType(TypeEl),Params,true,true);
|
|
CheckCallArrayCompatibility(TPasArrayType(TypeEl),Params,true,true);
|
|
for i:=0 to length(Params.Params)-1 do
|
|
for i:=0 to length(Params.Params)-1 do
|
|
AccessExpr(Params.Params[i],rraRead);
|
|
AccessExpr(Params.Params[i],rraRead);
|