Browse Source

* fix #40563: apply slightly adjusted patch by byte bites to use fixed range of 1..Length(str) for for-in loops iterating over ShortStrings
+ added test

Sven/Sarah Barth 1 year ago
parent
commit
953a4e1b64
2 changed files with 31 additions and 3 deletions
  1. 14 3
      compiler/nflw.pas
  2. 17 0
      tests/webtbs/tw40563.pp

+ 14 - 3
compiler/nflw.pas

@@ -553,7 +553,7 @@ implementation
       var
         loopstatement, loopbodystatement: tstatementnode;
         loopvar, stringvar: ttempcreatenode;
-        stringindex, loopbody, forloopnode: tnode;
+        stringindex, loopbody, forloopnode, fromn, ton: tnode;
       begin
         { result is a block of statements }
         result:=internalstatements(loopstatement);
@@ -585,9 +585,20 @@ implementation
         { add the actual statement to the loop }
         addstatement(loopbodystatement,hloopbody);
 
+        if tstringdef(expr.resultdef).stringtype=st_shortstring then
+          begin
+            fromn:=genintconstnode(1);
+            ton:=cinlinenode.create(in_length_x,false,ctemprefnode.create(stringvar));
+          end
+        else
+          begin
+             fromn:=cinlinenode.createintern(in_low_x,false,ctemprefnode.create(stringvar));
+             ton:= cinlinenode.create(in_high_x,false,ctemprefnode.create(stringvar));
+           end;
+
         forloopnode:=cfornode.create(ctemprefnode.create(loopvar),
-          cinlinenode.createintern(in_low_x,false,ctemprefnode.create(stringvar)),
-          cinlinenode.create(in_high_x,false,ctemprefnode.create(stringvar)),
+          fromn,
+          ton,
           loopbody,
           false);
 

+ 17 - 0
tests/webtbs/tw40563.pp

@@ -0,0 +1,17 @@
+program tw40563;
+uses sysutils;
+var s:string[20];
+  r:shortstring;
+  x: Char;
+begin
+  r:='';
+  s:=inttostr(12345);
+  for x in s do begin
+    r:=r+x;
+    write(ord(x):4);
+  end;
+  writeln;
+  if r<>s then
+    Halt(1);
+end.
+