From 4ff4c2456d41d5d40dd99e8108fc1a2b8dfa04d2 Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Fri, 8 May 2020 08:46:41 +0000 Subject: [PATCH] pas2js: error on compare static array git-svn-id: trunk@45309 - --- packages/fcl-passrc/src/pasresolver.pp | 2 +- packages/pastojs/src/fppas2js.pp | 25 +++++++++++++++++++++++++ packages/pastojs/tests/tcmodules.pas | 17 +++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/packages/fcl-passrc/src/pasresolver.pp b/packages/fcl-passrc/src/pasresolver.pp index 946ac7119c..00900058b0 100644 --- a/packages/fcl-passrc/src/pasresolver.pp +++ b/packages/fcl-passrc/src/pasresolver.pp @@ -2216,7 +2216,7 @@ type ErrorEl: TPasElement; RaiseOnIncompatible: boolean): integer; function CheckEqualCompatibilityUserType( const LHS, RHS: TPasResolverResult; ErrorEl: TPasElement; - RaiseOnIncompatible: boolean): integer; // LHS.BaseType=btContext=RHS.BaseType and both rrfReadable + RaiseOnIncompatible: boolean): integer; virtual; // LHS.BaseType=btContext=RHS.BaseType and both rrfReadable function CheckTypeCast(El: TPasType; Params: TParamsExpr; RaiseOnError: boolean): integer; function CheckTypeCastRes(const FromResolved, ToResolved: TPasResolverResult; ErrorEl: TPasElement; RaiseOnError: boolean): integer; virtual; diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index a715478289..dc00e20367 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -1449,6 +1449,10 @@ type procedure AddElementData(Data: TPas2JsElementData); virtual; function CreateElementData(DataClass: TPas2JsElementDataClass; El: TPasElement): TPas2JsElementData; virtual; + // checking compatibilility + function CheckEqualCompatibilityUserType(const LHS, + RHS: TPasResolverResult; ErrorEl: TPasElement; + RaiseOnIncompatible: boolean): integer; override; // utility procedure RaiseMsg(const Id: TMaxPrecInt; MsgNumber: integer; const Fmt: String; Args: array of {$IFDEF pas2js}jsvalue{$ELSE}const{$ENDIF}; ErrorPosEl: TPasElement); override; @@ -5979,6 +5983,20 @@ begin AddElementData(Result); end; +function TPas2JSResolver.CheckEqualCompatibilityUserType(const LHS, + RHS: TPasResolverResult; ErrorEl: TPasElement; RaiseOnIncompatible: boolean + ): integer; +begin + Result:=inherited CheckEqualCompatibilityUserType(LHS,RHS,ErrorEl,RaiseOnIncompatible); + if Result=cIncompatible then exit; + if (LHS.LoTypeEl is TPasArrayType) + and (length(TPasArrayType(LHS.LoTypeEl).Ranges)>0) then + RaiseMsg(20200508103543,nXIsNotSupported,sXIsNotSupported,['compare static array'],ErrorEl); + if (RHS.LoTypeEl is TPasArrayType) + and (length(TPasArrayType(RHS.LoTypeEl).Ranges)>0) then + RaiseMsg(20200508103544,nXIsNotSupported,sXIsNotSupported,['compare static array'],ErrorEl); +end; + procedure TPas2JSResolver.RaiseMsg(const Id: TMaxPrecInt; MsgNumber: integer; const Fmt: String; Args: array of {$IFDEF pas2js}jsvalue{$ELSE}const{$ENDIF}; ErrorPosEl: TPasElement); @@ -7728,6 +7746,7 @@ var JSBinClass: TJSBinaryClass; ResolvedEl: TPasResolverResult; AInt, BInt: TMaxPrecInt; + LArrType: TPasArrayType; begin {$IFDEF VerbosePas2JS} writeln('TPasToJSConverter.ConvertBinaryExpressionRes OpCode="',OpcodeStrings[El.OpCode],'" Left=',GetResolverResultDbg(LeftResolved),' Right=',GetResolverResultDbg(RightResolved)); @@ -8254,6 +8273,7 @@ begin end else if LeftTypeEl.ClassType=TPasArrayType then begin + LArrType:=TPasArrayType(LeftTypeEl); if RightResolved.BaseType=btNil then begin // convert "array = nil" to "rtl.length(array) === 0" @@ -8261,6 +8281,11 @@ begin Result:=CreateCmpArrayWithNil(El,A,El.OpCode); A:=nil; exit; + end + else if length(LArrType.Ranges)>0 then + begin + // LHS is static array + aResolver.RaiseMsg(20200508102656,nXIsNotSupported,sXIsNotSupported,['compare static array'],TPasElement(El)); end; end; end; diff --git a/packages/pastojs/tests/tcmodules.pas b/packages/pastojs/tests/tcmodules.pas index 3deb505f76..c7176674fc 100644 --- a/packages/pastojs/tests/tcmodules.pas +++ b/packages/pastojs/tests/tcmodules.pas @@ -424,6 +424,7 @@ type Procedure TestArray_StaticChar; Procedure TestArray_StaticMultiDim; Procedure TestArray_StaticInFunction; + Procedure TestArray_StaticMultiDimEqualNotImplemented; Procedure TestArrayOfRecord; Procedure TestArray_StaticRecord; Procedure TestArrayOfSet; @@ -8884,6 +8885,22 @@ begin ''])); end; +procedure TTestModule.TestArray_StaticMultiDimEqualNotImplemented; +begin + StartProgram(false); + Add([ + 'type', + ' TArrayInt = array[1..3,1..2] of longint;', + 'var', + ' a,b: TArrayInt;', + 'begin', + ' if a=b then ;', + '']); + SetExpectedPasResolverError('compare static array is not supported', + nXIsNotSupported); + ConvertProgram; +end; + procedure TTestModule.TestArrayOfRecord; begin StartProgram(false);