2
0
Эх сурвалжийг харах

fcl-passrc: fixed set literal of widechar, issue #35001

git-svn-id: trunk@41218 -
Mattias Gaertner 6 жил өмнө
parent
commit
57ece7b0f5

+ 2 - 2
packages/fcl-passrc/src/pasresolveeval.pas

@@ -3580,13 +3580,13 @@ begin
           Result.ElKind:=revskChar
         else if Result.ElKind<>revskChar then
           RaiseNotYetImplemented(20170713201456,El);
-        if StringToOrd(Value,nil)>$ffff then
+        RangeStart:=StringToOrd(Value,nil);
+        if RangeStart>$ffff then
           begin
           // set of string (not of char)
           ReleaseEvalValue(TResEvalValue(Result));
           exit;
           end;
-        RangeStart:=ord(TResEvalString(Value).S[1]);
         RangeEnd:=RangeStart;
         end;
       {$endif}

+ 11 - 6
packages/fcl-passrc/src/pasresolver.pp

@@ -13389,6 +13389,7 @@ var
   Param: TPasExpr;
   ParamResolved: TPasResolverResult;
   EnumType: TPasEnumType;
+  C: TClass;
 begin
   if not CheckBuiltInMinParamCount(Proc,Expr,2,RaiseOnError) then
     exit(cIncompatible);
@@ -13400,13 +13401,17 @@ begin
   ComputeElement(Param,ParamResolved,[rcNoImplicitProc]);
   EnumType:=nil;
   if ([rrfReadable,rrfWritable]*ParamResolved.Flags=[rrfReadable,rrfWritable])
-      and ((ParamResolved.IdentEl is TPasVariable)
-        or (ParamResolved.IdentEl is TPasArgument)
-        or (ParamResolved.IdentEl is TPasResultElement)) then
+      and (ParamResolved.IdentEl<>nil) then
     begin
-    if (ParamResolved.BaseType=btSet)
-        and (ParamResolved.LoTypeEl is TPasEnumType) then
-      EnumType:=TPasEnumType(ParamResolved.LoTypeEl);
+    C:=ParamResolved.IdentEl.ClassType;
+    if (C.InheritsFrom(TPasVariable)
+        or (C=TPasArgument)
+        or (C=TPasResultElement)) then
+      begin
+      if (ParamResolved.BaseType=btSet)
+          and (ParamResolved.LoTypeEl is TPasEnumType) then
+        EnumType:=TPasEnumType(ParamResolved.LoTypeEl);
+      end;
     end;
   if EnumType=nil then
     begin

+ 4 - 1
packages/pastojs/tests/tcmodules.pas

@@ -5495,7 +5495,6 @@ end;
 procedure TTestModule.TestSet_AnonymousEnumTypeChar;
 begin
   exit;
-
   StartProgram(false);
   Add([
   'type',
@@ -5584,6 +5583,7 @@ begin
   'const',
   '  LowChars = [''a''..''z''];',
   '  Chars = LowChars+[''A''..''Z''];',
+  '  sc = [''А'', ''Я''];',
   'var',
   '  c: char;',
   '  s: string;',
@@ -5594,12 +5594,14 @@ begin
   '  if c in chars then ;',
   '  if c in [''a''..''z'',''_''] then ;',
   '  if ''b'' in [''a''..''z'',''_''] then ;',
+  '  if ''Я'' in sc then ;',
   '']);
   ConvertProgram;
   CheckSource('TestSet_ConstChar',
     LinesToStr([ // statements
     'this.LowChars = rtl.createSet(null, 97, 122);',
     'this.Chars = rtl.unionSet($mod.LowChars, rtl.createSet(null, 65, 90));',
+    'this.sc = rtl.createSet(1040, 1071);',
     'this.c = "";',
     'this.s = "";',
     '']),
@@ -5610,6 +5612,7 @@ begin
     'if ($mod.c.charCodeAt() in $mod.Chars) ;',
     'if ($mod.c.charCodeAt() in rtl.createSet(null, 97, 122, 95)) ;',
     'if (98 in rtl.createSet(null, 97, 122, 95)) ;',
+    'if (1071 in $mod.sc) ;',
     '']));
 end;