From 01ac3334af94bfa1e183e2b800d418c5645044c5 Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Sun, 1 Oct 2017 18:19:31 +0000 Subject: [PATCH] fcl-passrc: fixed checking static array constant elements git-svn-id: trunk@37375 - --- packages/fcl-passrc/src/pasresolver.pp | 5 ++++- packages/fcl-passrc/tests/tcresolver.pas | 14 +++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/fcl-passrc/src/pasresolver.pp b/packages/fcl-passrc/src/pasresolver.pp index 3305e59ffe..69ecd5d5a5 100644 --- a/packages/fcl-passrc/src/pasresolver.pp +++ b/packages/fcl-passrc/src/pasresolver.pp @@ -11051,7 +11051,7 @@ end; procedure TPasResolver.CheckAssignExprRange( const LeftResolved: TPasResolverResult; RHS: TPasExpr); -// check if RHS fits into range LeftResolved +// if RHS is a constant check if it fits into range LeftResolved var RValue, RangeValue: TResEvalValue; MinVal, MaxVal: int64; @@ -11062,6 +11062,8 @@ var bt: TResolverBaseType; w: WideChar; begin + if (LeftResolved.TypeEl<>nil) and (LeftResolved.TypeEl.ClassType=TPasArrayType) then + exit; // arrays are checked by element, not by the whole value RValue:=Eval(RHS,[refAutoConst]); if RValue=nil then exit; // not a const expression @@ -12340,6 +12342,7 @@ function TPasResolver.CheckAssignCompatibilityArrayType(const LHS, Result:=CheckAssignResCompatibility(ElTypeResolved,ValueResolved,Value,RaiseOnIncompatible); if Result=cIncompatible then exit; + CheckAssignExprRange(ElTypeResolved,Value); end else begin diff --git a/packages/fcl-passrc/tests/tcresolver.pas b/packages/fcl-passrc/tests/tcresolver.pas index 2f17df4290..b85a94192a 100644 --- a/packages/fcl-passrc/tests/tcresolver.pas +++ b/packages/fcl-passrc/tests/tcresolver.pas @@ -537,6 +537,7 @@ type Procedure TestDynArrayOfLongint; Procedure TestStaticArray; Procedure TestStaticArrayOfChar; + Procedure TestStaticArrayOfRangeElCheckFail; Procedure TestArrayOfArray; Procedure TestArrayOfArray_NameAnonymous; Procedure TestFunctionReturningArray; @@ -8699,7 +8700,7 @@ begin Add('type'); Add(' TArrA = array[1..3] of char;'); Add('const'); - Add(' A: TArrA = (''p'',''a'',''b'');'); + Add(' A: TArrA = (''p'',''a'',''p'');'); // duplicate allowed, this bracket is not a set Add(' B: TArrA = ''pas'';'); Add(' Three = length(TArrA);'); Add(' C: array[1..Three] of char = ''pas'';'); @@ -8710,6 +8711,17 @@ begin ParseProgram; end; +procedure TTestResolver.TestStaticArrayOfRangeElCheckFail; +begin + StartProgram(false); + Add('var'); + Add(' A: array[1..2] of shortint = (1,300);'); + Add('begin'); + ParseProgram; + CheckResolverHint(mtWarning,nRangeCheckEvaluatingConstantsVMinMax, + 'range check error while evaluating constants (300 must be between -128 and 127)'); +end; + procedure TTestResolver.TestArrayOfArray; begin StartProgram(false);