浏览代码

fcl-passrc: resolver: fixed array[enum..enum]

git-svn-id: trunk@38243 -
Mattias Gaertner 7 年之前
父节点
当前提交
a86cfa9aa0
共有 3 个文件被更改,包括 38 次插入16 次删除
  1. 8 0
      packages/fcl-passrc/src/pasresolver.pp
  2. 8 1
      packages/fcl-passrc/tests/tcresolver.pas
  3. 22 15
      packages/pastojs/tests/tcmodules.pas

+ 8 - 0
packages/fcl-passrc/src/pasresolver.pp

@@ -4101,7 +4101,12 @@ begin
     ResolveExpr(Expr,rraRead);
     ComputeElement(Expr,RangeResolved,[rcConstant]);
     if (RangeResolved.IdentEl<>nil) and not (RangeResolved.IdentEl is TPasType) then
+      begin
+      {$IFDEF VerbosePasResolver}
+      writeln('TPasResolver.FinishArrayType ',GetResolverResultDbg(RangeResolved));
+      {$ENDIF}
       RaiseXExpectedButYFound(20170216151607,'range',GetElementTypeName(RangeResolved.IdentEl),Expr);
+      end;
     if (RangeResolved.BaseType=btRange) then
       begin
       if (RangeResolved.SubType in btArrayRangeTypes) then
@@ -4111,6 +4116,8 @@ begin
         TypeEl:=ResolveAliasType(RangeResolved.TypeEl);
         if TypeEl is TPasRangeType then
           // custom range
+        else if TypeEl is TPasEnumType then
+          // anonymous enum range
         else
           RaiseXExpectedButYFound(20171009193629,'range',GetElementTypeName(RangeResolved.IdentEl),Expr);
         end
@@ -7699,6 +7706,7 @@ begin
           begin
           CheckSetLitElCompatible(Bin.left,Bin.right,LeftResolved,RightResolved);
           ResolvedEl:=LeftResolved;
+          ResolvedEl.IdentEl:=nil;
           ResolvedEl.SubType:=ResolvedEl.BaseType;
           ResolvedEl.BaseType:=btRange;
           ResolvedEl.ExprEl:=Bin;

+ 8 - 1
packages/fcl-passrc/tests/tcresolver.pas

@@ -10349,20 +10349,27 @@ begin
   '  TEnum = (red,blue,green);',
   '  TEnumRg = blue..green;',
   '  TEnumArray = array[TEnumRg] of longint;',
+  '  TEnumArray2 = array[blue..green] of longint;',
   'var',
   '  e: TEnum;',
   '  r: TEnumRg;',
   '  i: longint;',
   '  a: TEnumArray;',
   '  b: array[TEnum] of longint;',
+  '  c: TEnumArray2;',
   '  names: array[TEnumRg] of string = (''blue'',''green'');',
   'begin',
   '  r:=low(a);',
   '  r:=high(a);',
   '  i:=a[red];',
-  '  a[r]:=a[r];',
   '  a[e]:=a[e];',
+  '  a[r]:=a[r];',
   '  b[r]:=b[r];',
+  '  r:=low(c);',
+  '  r:=high(c);',
+  '  i:=c[red];',
+  '  c[e]:=c[e];',
+  '  c[r]:=c[r];',
   '']);
   ParseProgram;
 end;

+ 22 - 15
packages/pastojs/tests/tcmodules.pas

@@ -3425,11 +3425,15 @@ begin
   '  TEnum = (Red, Green, Blue);',
   '  TEnumRg = green..blue;',
   '  TArr = array[TEnumRg] of byte;',
+  '  TArr2 = array[green..blue] of byte;',
   'var',
   '  a: TArr;',
   '  b: TArr = (3,4);',
+  '  c: TArr2 = (5,6);',
   'begin',
-  '  a[green] := b[blue];']);
+  '  a[green] := b[blue];',
+  '  c[green] := c[blue];',
+  '']);
   ConvertProgram;
   CheckSource('TestEnumRange_Array',
     LinesToStr([ // statements
@@ -3443,9 +3447,11 @@ begin
     '};',
     'this.a = rtl.arraySetLength(null, 0, 2);',
     'this.b = [3, 4];',
+    'this.c = [5, 6];',
     '']),
     LinesToStr([
     '  $mod.a[$mod.TEnum.Green - 1] = $mod.b[$mod.TEnum.Blue - 1];',
+    '  $mod.c[$mod.TEnum.Green - 1] = $mod.c[$mod.TEnum.Blue - 1];',
     '']));
 end;
 
@@ -6271,20 +6277,21 @@ end;
 procedure TTestModule.TestArrayEnumTypeRange;
 begin
   StartProgram(false);
-  Add('type');
-  Add('  TEnum = (red,blue);');
-  Add('  TEnumArray = array[TEnum] of longint;');
-  Add('var');
-  Add('  e: TEnum;');
-  Add('  i: longint;');
-  Add('  a: TEnumArray;');
-  Add('  numbers: TEnumArray = (1,2);');
-  Add('  names: array[TEnum] of string = (''red'',''blue'');');
-  Add('begin');
-  Add('  e:=low(a);');
-  Add('  e:=high(a);');
-  Add('  i:=a[red];');
-  Add('  a[e]:=a[e];');
+  Add([
+  'type',
+  '  TEnum = (red,blue);',
+  '  TEnumArray = array[TEnum] of longint;',
+  'var',
+  '  e: TEnum;',
+  '  i: longint;',
+  '  a: TEnumArray;',
+  '  numbers: TEnumArray = (1,2);',
+  '  names: array[TEnum] of string = (''red'',''blue'');',
+  'begin',
+  '  e:=low(a);',
+  '  e:=high(a);',
+  '  i:=a[red];',
+  '  a[e]:=a[e];']);
   ConvertProgram;
   CheckSource('TestArrayEnumTypeRange',
     LinesToStr([ // statements