Browse Source

* handle <dyn.array>+[] (and swapped) correctly, resolves #39919

florian 2 years ago
parent
commit
ad7cc0e69d
2 changed files with 39 additions and 7 deletions
  1. 23 7
      compiler/nadd.pas
  2. 16 0
      tests/webtbs/tw39919.pp

+ 23 - 7
compiler/nadd.pas

@@ -3015,13 +3015,29 @@ implementation
          { <dyn. array>+<dyn. array> ? }
          else if (nodetype=addn) and (is_dynamic_array(ld) or is_dynamic_array(rd)) then
            begin
-              result:=maybe_convert_to_insert;
-              if assigned(result) then
-                exit;
-              if not(is_dynamic_array(ld)) then
-                inserttypeconv(left,rd);
-              if not(is_dynamic_array(rd)) then
-                inserttypeconv(right,ld);
+              { empty array to add? }
+              if (right.nodetype=arrayconstructorn) and (tarrayconstructornode(right).left=nil) then
+                begin
+                  result:=left;
+                  left:=nil;
+                  exit;
+                end
+              else if (left.nodetype=arrayconstructorn) and (tarrayconstructornode(left).left=nil) then
+                begin
+                  result:=right;
+                  right:=nil;
+                  exit;
+                end
+              else
+                begin
+                  result:=maybe_convert_to_insert;
+                  if assigned(result) then
+                    exit;
+                  if not(is_dynamic_array(ld)) then
+                    inserttypeconv(left,rd);
+                  if not(is_dynamic_array(rd)) then
+                    inserttypeconv(right,ld);
+                end;
            end
 
         { support dynamicarray=nil,dynamicarray<>nil }

+ 16 - 0
tests/webtbs/tw39919.pp

@@ -0,0 +1,16 @@
+{ %opt=-Sc }
+{$mode objfpc}
+{$modeswitch arrayoperators}
+
+program test;
+
+var
+  a: array of integer;
+begin
+  a := nil;
+  a += []; // error: Internal error 200305091
+  a := a+[]; // error: Internal error 200305091
+  a := []+a; // error: Internal error 200305091
+  if length(a)<>0 then
+    halt(1);
+end.