inline und typehelpers läuft falsch

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Mathias
Beiträge: 6210
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

inline und typehelpers läuft falsch

Beitrag von Mathias »

Compiliere ich folgenden Code und starte ihn, wird folgendes ausgespuckt.

Code: Alles auswählen

0.0000
1.0000
1.0000

Code: Alles auswählen

program project1;

  {$mode objfpc}
  {$modeswitch typehelpers}

type
  TVector2f = array[0..1] of single;
  PVector2f = ^TVector2f;

  TVector2fHelper = type Helper for TVector2f
  public
    procedure Translate(x, y: single);
  end;

  procedure TVector2fHelper.Translate(x, y: single); inline; // das inline
  begin
    Self[0] += x;
    Self[1] += y;
  end;

var
  v: TVector2f = (0, 0);
  pv: PVector2f;
begin
  WriteLn(v[0]);
  v.Translate(1, 0); // io.
  WriteLn(v[0]);

  pv := @v;
  pv^.Translate(3, 0); // bug
  WriteLn(v[0]);

  WriteLn('ende');
end.
Entferne ich aber das inline bei translate, dann wird wie erwartet

Code: Alles auswählen

0.0000
1.0000
4.0000
ausgepuckt.

Ich bin noch weiter zurück gegangen und habe es nur mit einem einfachen Single probiert, dann hat er schon beim kompilieren mühe. project1.lpr(48,3) Error: Internal error 200109227

Code: Alles auswählen

program project1;

  {$mode objfpc}
  {$modeswitch typehelpers}

type
  TFloatHelper = type Helper for single
  public
    procedure Translate(x: single);
  end;

  procedure TFloatHelper.Translate(x: single); inline;  // das inline
  begin
    Self += x;
  end;

var
  f: Single;
  pf: PSingle;
begin
  f.Translate(1);
  WriteLn(f: 10: 5);
  pf := @f;  // Hier der internal error
  pf^.Translate(3);
  WriteLn(f: 10: 5);
  WriteLn();
end.   
Kompiliert mit FPC Linux 64bit und der neusten Trunc von gestern.

Ich denke, dies ist ein Bug-Report wert.
Seit ihr der gleiche Meinung ?

Nachtrag: Habe es noch mit der stable 3.2.2 probiert, dort scheint alles zu funktionieren, egal ob mit oder ohne inline.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6210
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: inline und typehelpers läuft falsch

Beitrag von Mathias »

Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten