crash (stack-overflow) in compiler 3.3.1 - assigning pointers with recursive type definition - compare_defs_ext -> equal_defs -> compare_defs_ext ...
Tested with 3.3.1 f50e6dfe
Compiling the below code crashes fpc.
program Project1;
{$mode objfpc}{$H+}
type
TRecursePtrA1 = ^TRecursePtrA2;
TRecursePtrA2 = ^TRecursePtrA1;
var
RecursePtrA1: TRecursePtrA1;
RecursePtrA2: TRecursePtrA2;
begin
RecursePtrA2 := RecursePtrA1;
end.
This should probably be an "incompatible types" error?
I discovered this due to a typo. The code was meant to be RecursePtrA2 := @RecursePtrA1;
. And with the @
it compiles just fine.
Free Pascal Compiler version 3.3.1 [2022/03/23] for x86_64
Copyright (c) 1993-2022 by Florian Klaempfl and others
(1002) Target OS: Win64 for x64
(3104) Compiling C:\Users\martin\AppData\Local\Temp\project1.lpr
C:\Users\martin\AppData\Local\Temp\project1.lpr(10,19) Warning: (5037) Variable "RecursePtrA1" does not seem to be initialized
C:\Users\martin\AppData\Local\Temp\project1.lpr(10,16) Error: (1026) Compilation raised exception internally
Fatal: (1018) Compilation aborted
An unhandled exception occurred at $000000010009CEBC:
EStackOverflow: Stack overflow or stack misalignment
$000000010009CEBC compare_defs_ext, line 268 of defcmp.pas
$00000001000A0108 equal_defs, line 2108 of defcmp.pas
$000000010009F393 compare_defs_ext, line 1588 of defcmp.pas
$00000001000A0108 equal_defs, line 2108 of defcmp.pas
$000000010009F393 compare_defs_ext, line 1588 of defcmp.pas
$00000001000A0108 equal_defs, line 2108 of defcmp.pas
$000000010009F393 compare_defs_ext, line 1588 of defcmp.pas
$00000001000A0108 equal_defs, line 2108 of defcmp.pas
$000000010009F393 compare_defs_ext, line 1588 of defcmp.pas
$00000001000A0108 equal_defs, line 2108 of defcmp.pas
$000000010009F393 compare_defs_ext, line 1588 of defcmp.pas
$00000001000A0108 equal_defs, line 2108 of defcmp.pas
$000000010009F393 compare_defs_ext, line 1588 of defcmp.pas
$00000001000A0108 equal_defs, line 2108 of defcmp.pas
$000000010009F393 compare_defs_ext, line 1588 of defcmp.pas
$00000001000A0108 equal_defs, line 2108 of defcmp.pas
$000000010009F393 compare_defs_ext, line 1588 of defcmp.pas