Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Typisierte lokale Konstante in Generic-Unterklasse - Compiler-Bug?

  Alt 3. Jan 2014, 12:33
Delphi-Version: XE5
Delphi XE5 Enterprise, Update 1. Ich bin verwirrt. Man nehme folgende zwei Units und sorge dafür, dass auf einer TChildClass -Instanz die Methode doStuff() aufgerufen wird.

Soweit das $DEFINE CAUSE_URW_ERROR nicht auskommentiert wird, kann der Compiler die Unit ChildClass nicht kompilieren und meldet:
  • "[dcc64 Fataler Fehler] ChildClass.pas(10): F2084 Interner Fehler: URW1154"
  • "[dcc32 Fataler Fehler] ChildClass.pas(10): F2084 Interner Fehler: URW1154"

Andere Compiler-Backends habe ich nicht ausprobiert.


Delphi-Quellcode:
unit BaseClass;

interface
   type

      TBaseClass<T: class> = class abstract
         protected var
            someField: Boolean;
         public
            procedure doStuff(); virtual; final;
      end;

implementation

// {$DEFINE CAUSE_URW_ERROR}

// Causes fatal "Internal Error: URW1154" on Unit ChildClass.pas
// using dcc32 or dcc64

// Used version: "Embarcadero® Delphi® XE5 Version 19.0.13856.4978"
// meaning "RAD Studio XE5 Enterprise, Update 1"

procedure TBaseClass<T>.doStuff();
const
   {$IFDEF CAUSE_URW_ERROR}
      someConstant: Boolean = True;
   {$ELSE}
      someConstant = True;
   {$ENDIF}
   // Could as well be defined in the class header
   // The only thing that matters is that the constant has to be typed,
   // the superclass has to make use of generics and the subclass has to be
   // in another unit. That's all that matters.
begin
   someField := someConstant;
end;

end.
Delphi-Quellcode:
unit ChildClass;

interface uses BaseClass;

   type TChildClass = class(TBaseClass<TObject>);

implementation
end.
Wie man sieht läuft alles bestens, wenn die Konstante nicht explizit auf Boolean typisiert ist. Ich habe allerdings keine Ahnung, warum.

In der Fixliste für XE5 taucht komischerweise "F2084 Internal Error: URW1154" auf, der entsprechende QC-Report ist als "Resolved in Build: : XE5" markiert.

Mehr finde ich im Internet nicht. Was soll ich nun tun? Könnt Ihr das reproduzieren? Wie verhalten sich andere Compiler (OSX, iOS, Android)? Kann ich das so (wieder) im QC melden?

Geändert von Der schöne Günther ( 3. Jan 2014 um 13:57 Uhr) Grund: Kommentare in Unit BaseClass
  Mit Zitat antworten Zitat