Delphi Pascal XE4 Compiler Error?

I wonder if I found an Embarcadero compiler error ...

The problem is that it is related to generics.

Here is my source code

unit u_DateCount; interface uses SysUtils, u_JavaScriptable ; type TDateCount = class (TJavaScriptable) strict private public NoOfSamples : Integer; TheDate : TDate; function ToString():String; override; end; implementation function TDateCount.ToString():String; var myYear, myMonth, myDay : Word; begin DecodeDate(TheDate, myYear, myMonth, myDay); Result := Format('[new Date(%d, %d ,0), %d]', [myYear, myMonth, NoOfSamples]); end; end. 

 unit u_Javascriptable; interface type TJavaScriptable = class strict private public function ToString:String; override; end; implementation function TJavaScriptable.ToString:String; begin Result := ''; end; end. 

 unit u_LineChart; interface uses System.IOUtils, SysUtils, System.Generics.Collections, u_JavaScriptable ; type TLineChart<RecordType : TJavaScriptable> = class strict private Template : String; function ConvertRecordsToString():String; public Records : TList<RecordType>; function ToString():String; constructor Create(templatePath : String); destructor Destroy(); override; end; implementation function TLineChart<RecordType>.ConvertRecordsToString():String; var I: Integer; begin //Open brackets Result := '[ '; //The first record if Records.Count > 0 then begin Result := Result + Records[0].ToString(); end; //Loop over records for I := 1 to Records.Count - 1 do begin Result := Result + ', ' + Records[I].ToString(); end; //Close bracket Result := Result + ' ]'; end; function TLineChart<RecordType>.ToString():String; begin Result := Format(Template, [ConvertRecordsToString()]); end; constructor TLineChart<RecordType>.Create(templatePath : String); begin inherited Create(); Template := TFile.ReadAllText(templatePath); Records := TList<RecordType>.Create(); end; destructor TLineChart<RecordType>.Destroy(); var I: Integer; begin if Assigned(Records) then begin for I := 0 to Records.Count - 1 do begin Records[I].Destroy(); end; Records.Clear(); Records.Destroy(); Records := nil; end; inherited; end; end. 

And finally, the main program

 program Project4; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, u_Javascriptable in 'u_Javascriptable.pas', u_LineChart in 'u_LineChart.pas', u_DateCount in 'u_DateCount.pas'; var lineChart : TLineChart<TDateCount>; begin lineChart := TLineChart<TDateCount>.Create('linechart.html'); try except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. 

The error message that I get when I try to compile this,

[dcc32 Fatal Error] Project4.dpr (30): F2084 Internal error: AV097530AC-R00000014-0

Usually, when I see an error message like this, I can fix it by closing the IDE embarcadero and restarting it. However, this time it did not work.

+4
source share
3 answers

The problem is the implementation of TLineChart<RecordType>.Destroy() .

Change Records[I].Destroy(); to Records[I].Free(); and it will work. Or you just do it right and use TObjectList<RecordType>.Create; in a constructor that takes care of destroying all the elements in it when destroying the list.

Never call Destroy directly. Use Free . Although this should not lead to a compiler error, it is wrong anyway.

+10
source

If the compiler reports an β€œinternal error”, it is always a compiler error. To do this, you need to open a ticket in QC. Hope they can install it for XE5.

+4
source

Since this works in XE3, but not in XE4, I assume this is a XE4 bug. Until this is fixed, the solution should use a different version of the compiler, such as XE3.

+1
source

Source: https://habr.com/ru/post/1501238/


All Articles