Pārlūkot izejas kodu

-- Zusammenführen von r47415 in ».«:
U compiler/nbas.pas
A tests/webtbs/tw38069.pp
A tests/webtbs/uw38069.pp
-- Aufzeichnung der Informationen für Zusammenführung von r47415 in ».«:
U .

git-svn-id: branches/fixes_3_2@47422 -

florian 4 gadi atpakaļ
vecāks
revīzija
37e676d927
4 mainītis faili ar 116 papildinājumiem un 0 dzēšanām
  1. 2 0
      .gitattributes
  2. 6 0
      compiler/nbas.pas
  3. 12 0
      tests/webtbs/tw38069.pp
  4. 96 0
      tests/webtbs/uw38069.pp

+ 2 - 0
.gitattributes

@@ -17718,6 +17718,7 @@ tests/webtbs/tw3780.pp svneol=native#text/plain
 tests/webtbs/tw3782.pp svneol=native#text/plain
 tests/webtbs/tw3796.pp svneol=native#text/plain
 tests/webtbs/tw3805.pp svneol=native#text/plain
+tests/webtbs/tw38069.pp svneol=native#text/pascal
 tests/webtbs/tw3814.pp svneol=native#text/plain
 tests/webtbs/tw3827.pp svneol=native#text/plain
 tests/webtbs/tw3829.pp svneol=native#text/plain
@@ -18254,6 +18255,7 @@ tests/webtbs/uw3429.pp svneol=native#text/plain
 tests/webtbs/uw3474a.pp svneol=native#text/plain
 tests/webtbs/uw3474b.pp svneol=native#text/plain
 tests/webtbs/uw36544.pp svneol=native#text/pascal
+tests/webtbs/uw38069.pp svneol=native#text/pascal
 tests/webtbs/uw3968.pp svneol=native#text/plain
 tests/webtbs/uw4056.pp svneol=native#text/plain
 tests/webtbs/uw4140.pp svneol=native#text/plain

+ 6 - 0
compiler/nbas.pas

@@ -1067,6 +1067,12 @@ implementation
         if assigned(tempinfo^.tempinitcode) then
           firstpass(tempinfo^.tempinitcode);
         inc(current_procinfo.estimatedtempsize,size);;
+        { if a temp. create node is loaded from a ppu, it could be that the unit was compiled with other settings which
+          enabled a certain type to be stored in a register while the current settings do not support this, so correct this here
+          if needed
+        }
+        if not(tstoreddef(tempinfo^.typedef).is_fpuregable) and not(tstoreddef(tempinfo^.typedef).is_intregable) and (ti_may_be_in_reg in tempflags) then
+          excludetempflag(ti_may_be_in_reg);
       end;
 
 

+ 12 - 0
tests/webtbs/tw38069.pp

@@ -0,0 +1,12 @@
+{ %cpu=i386 }
+{$mode objfpc}
+{$OPTIMIZATION REGVAR}
+{.$FPUTYPE SSE2}  //uncommenting this resolves the problem
+
+uses uw38069;
+
+var z: complex;
+    n: integer;
+begin
+  z := z*n;  //internal error 200604201
+end.

+ 96 - 0
tests/webtbs/uw38069.pp

@@ -0,0 +1,96 @@
+{ %cpu=i386 }
+{$mode objfpc}
+{$modeswitch advancedrecords}
+{$FPUTYPE SSE2}
+
+unit uw38069;
+INTERFACE
+uses sysutils;
+type  float  = double; //#zentral definieren
+      complex = record
+        public
+          re, im: float;
+          class operator * (const a, b: complex): complex; inline;
+          class operator * (const a: complex; const x:float): complex; inline;
+          class operator * (const x: float; const a: complex): complex; inline;
+
+          class operator := (const x: float): complex;     inline;
+          class operator  = (const a,b: complex): boolean; inline;
+          class operator  - (const a: complex): complex;   inline;
+        end;
+
+
+procedure mul (const a,b: complex; var c: complex); inline; overload;
+procedure mul (const a: complex; const b: float; var c: complex); inline; overload;
+procedure mul (const a: float; const b: complex; var c: complex); inline; overload;
+
+
+IMPLEMENTATION
+
+
+procedure mul (const a,b: complex; var c: complex);
+begin
+  c.re := a.re*b.re - a.im*b.im;
+  c.im := a.re*b.im + a.im*b.re;
+end;
+
+procedure mul (const a: complex; const b: float; var c: complex);
+begin
+  c.re := a.re*b;
+  c.im := a.im*b;
+end;
+
+
+procedure mul (const a: float; const b: complex; var c: complex);
+begin
+  mul (b,a,c);
+end;
+
+function pow (x,y: float): float;
+begin
+  result := exp (y*ln(x));
+end;
+
+
+function ToComplex (a,b: float): complex;
+begin
+  result.re := a;
+  result.im := b;
+end;
+
+//Operatoren complex-complex
+class operator complex.* (const a,b: complex): complex;
+begin
+  mul (a,b,result);
+end;
+
+class operator complex.* (const x: float; const a: complex): complex;
+begin
+  mul (a,x,result);
+end;
+
+class operator complex.* (const a: complex; const x:float): complex;
+begin
+  mul (a,x,result);
+end;
+
+class operator complex.:= (const x: float): complex;
+begin
+  result.re := x;
+  result.im := 0;
+end;
+
+class operator complex.= (const a,b: complex): boolean;
+begin
+  result := (a.re=b.re) and (a.im=b.im);
+end;
+
+class operator complex.- (const a: complex): complex;
+begin
+  result.re := -a.re;
+  result.im := -a.im;
+end;
+
+
+begin
+end.