Browse Source

fcl-passrc: resolver: error on setlength(openarray)

git-svn-id: trunk@37466 -
Mattias Gaertner 7 years ago
parent
commit
69f2055ff3
2 changed files with 17 additions and 2 deletions
  1. 2 2
      packages/fcl-passrc/src/pasresolver.pp
  2. 15 0
      packages/fcl-passrc/tests/tcresolver.pas

+ 2 - 2
packages/fcl-passrc/src/pasresolver.pp

@@ -886,7 +886,7 @@ type
 
   TPasResolverOption = (
     proFixCaseOfOverrides,  // fix Name of overriding proc/property to the overriden proc/property
-    proClassPropertyNonStatic,  // class property accessor must be non static
+    proClassPropertyNonStatic,  // class property accessors are non static
     proPropertyAsVarParam, // allows to pass a property as a var/out argument
     proClassOfIs, // class-of supports is and as operator
     proExtClassInstanceNoTypeMembers, // class members of external class cannot be accessed by instance
@@ -8251,7 +8251,7 @@ begin
       Result:=cExact
     else if ParamResolved.BaseType=btContext then
       begin
-      if IsDynArray(ParamResolved.TypeEl) then
+      if IsDynArray(ParamResolved.TypeEl) and not IsOpenArray(ParamResolved.TypeEl) then
         begin
         Result:=cExact;
         DynArr:=NoNil(ParamResolved.TypeEl) as TPasArrayType;

+ 15 - 0
packages/fcl-passrc/tests/tcresolver.pas

@@ -565,6 +565,7 @@ type
     Procedure TestArray_OpenArrayOfString;
     Procedure TestArray_OpenArrayOfString_IntFail;
     Procedure TestArray_OpenArrayOverride;
+    Procedure TestArray_OpenArrayAsDynArraySetLengthFail;
     Procedure TestArray_CopyConcat;
     Procedure TestStaticArray_CopyConcat;// ToDo
     Procedure TestArray_CopyMismatchFail;
@@ -9250,6 +9251,20 @@ begin
   ParseProgram;
 end;
 
+procedure TTestResolver.TestArray_OpenArrayAsDynArraySetLengthFail;
+begin
+  ResolverEngine.Options:=ResolverEngine.Options+[proOpenAsDynArrays];
+  StartProgram(false);
+  Add([
+  'procedure DoIt(a: array of byte);',
+  'begin',
+  '  SetLength(a,3);',
+  'end;',
+  'begin']);
+  CheckResolverException('Incompatible type arg no. 1: Got "array of Byte", expected "string or dynamic array variable"',
+    nIncompatibleTypeArgNo);
+end;
+
 procedure TTestResolver.TestArray_CopyConcat;
 begin
   StartProgram(false);