Преглед на файлове

* do not take the size of an open array, resolves #33230

git-svn-id: trunk@38366 -
florian преди 7 години
родител
ревизия
e523865b07
променени са 3 файла, в които са добавени 22 реда и са изтрити 2 реда
  1. 1 0
      .gitattributes
  2. 6 2
      compiler/ncnv.pas
  3. 15 0
      tests/webtbs/tw33230.pp

+ 1 - 0
.gitattributes

@@ -16026,6 +16026,7 @@ tests/webtbs/tw33167.pp svneol=native#text/pascal
 tests/webtbs/tw3320.pp svneol=native#text/plain
 tests/webtbs/tw3320.pp svneol=native#text/plain
 tests/webtbs/tw33202.pp svneol=native#text/pascal
 tests/webtbs/tw33202.pp svneol=native#text/pascal
 tests/webtbs/tw33222.pp svneol=native#text/pascal
 tests/webtbs/tw33222.pp svneol=native#text/pascal
+tests/webtbs/tw33230.pp svneol=native#text/pascal
 tests/webtbs/tw3324.pp svneol=native#text/plain
 tests/webtbs/tw3324.pp svneol=native#text/plain
 tests/webtbs/tw3327.pp svneol=native#text/plain
 tests/webtbs/tw3327.pp svneol=native#text/plain
 tests/webtbs/tw3328.pp svneol=native#text/plain
 tests/webtbs/tw3328.pp svneol=native#text/plain

+ 6 - 2
compiler/ncnv.pas

@@ -2367,12 +2367,16 @@ implementation
         if (nf_absolute in flags) then
         if (nf_absolute in flags) then
           begin
           begin
             convtype:=tc_equal;
             convtype:=tc_equal;
-            if (tstoreddef(resultdef).is_intregable<>tstoreddef(left.resultdef).is_intregable) or
+            { we need to check regability only if something is really regable }
+            if ((tstoreddef(left.resultdef).is_intregable) or
+               (tstoreddef(resultdef).is_fpuregable)) and
+               (
+               (tstoreddef(resultdef).is_intregable<>tstoreddef(left.resultdef).is_intregable) or
                (tstoreddef(resultdef).is_fpuregable<>tstoreddef(left.resultdef).is_fpuregable) or
                (tstoreddef(resultdef).is_fpuregable<>tstoreddef(left.resultdef).is_fpuregable) or
                { like in pdecvar.read_absolute(): if the size changes, the
                { like in pdecvar.read_absolute(): if the size changes, the
                  register size would also have to change (but second_nothing
                  register size would also have to change (but second_nothing
                  does not handle this) }
                  does not handle this) }
-               (tstoreddef(resultdef).size<>tstoreddef(left.resultdef).size) then
+               (tstoreddef(resultdef).size<>tstoreddef(left.resultdef).size)) then
               make_not_regable(left,[ra_addr_regable]);
               make_not_regable(left,[ra_addr_regable]);
             exit;
             exit;
           end;
           end;

+ 15 - 0
tests/webtbs/tw33230.pp

@@ -0,0 +1,15 @@
+{$mode objfpc}
+program Project1;
+
+uses variants;
+
+  function CreateVarArray( const Bounds: array of SizeInt;
+                           const VarType: integer ): variant;
+  var
+    Dim01: array [0..1] of SizeInt absolute Bounds;
+  begin
+    Result := VarArrayCreate( Dim01, varType );
+  end;
+
+begin
+end.