Skip to content

Compiler intrinsic default() function: failing inside function and procedure parameters with: Error: Compilation raised exception internally

Summary

When compiling code that has default values to function parameters set via the compiler intrinsic default() function, the compiler raises an exception internally.

System Information

  • Operating system: Linux, AlmaLinux 9.2, x86_64
  • Processor architecture: x86-64
  • Compiler version: 3.3.1-13810-g1bcf4a5a
  • Device: Computer

Steps to reproduce

Given the following source code file named defaulting.pas:

{$mode objfpc}
{$h+}
{$codepage utf8}
program defaulting;


var
  a: integer = 0;
  b: integer = default(integer);

function c (d: integer = 0): integer;
  begin
    result := d;
  end;

procedure g (h: integer = 0);
  var
    i: integer = default(integer);
  begin
    writeln(h, i);
  end;

procedure j (k: integer = default(integer));
  var
    l: integer = default(integer);
  begin
    writeln(k, l);
  end;

function e (f: integer = default(integer)): integer;
  begin
    result := f;
  end;

function m (n: string = default(string)): string;
  var
    o: string = '1';
    p: string = default(string);
    q: string = '';
    r: string = '2';
  begin
    result := n + o + p + q + r;
  end;

begin
  writeln(a, b, c);
  g;
  j;
  writeln(m);
end.

When compiled, the following occurs:

$ fpc defaulting.pas
Free Pascal Compiler version 3.3.1 [2023/08/24] for x86_64
Copyright (c) 1993-2023 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling defaulting.pas
defaulting.pas(23,27) Error: Compilation raised exception internally
Fatal: Compilation aborted
An unhandled exception occurred at $00000000005541DF:
EAccessViolation: Access violation
  $00000000005541DF

The code in question the compiler is failing at is:

    16  procedure g (h: integer = 0);
    17    var
    18      i: integer = default(integer);
    19    begin                   |
    20      writeln(h, i);        |
    21    end;                   \|/
    22                            V
--->23  procedure j (k: integer = default(integer));
    24    var
    25      l: integer = default(integer);
    26    begin
    27      writeln(k, l);
    28    end;
    29
    30  function e (f: integer = default(integer)): integer;
    31    begin
    32      result := f;

Example Project

See steps to reproduce.

What is the current bug behavior?

See steps to reproduce.

What is the expected (correct) behavior?

When compiled with the released FPC, the code compiles and runs as expected.

$ fpc defaulting
Free Pascal Compiler version 3.2.2 [2022/08/17] for x86_64
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling defaulting.pas
Linking defaulting
51 lines compiled, 0.1 sec

$ ./defaulting
000
00
00
12

Relevant logs and/or screenshots

See steps to reproduce.

Possible fixes

None known.

Edited by bogen85
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information