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?