[fpc-devel] Val() behaviour in a function depends on LongStrings ON/OFF?

Bart bartjunk64 at gmail.com
Wed Oct 14 20:24:48 CEST 2026


Hi,

This is driving me crazy.
Val('256', AByte, Code) should fail.
It does, but sometimes it does not.

===========
uses
  sysutils;

{$PUSH}
{$R+}
function TryStrToByte_RangeCheck_ON(const S: String; out B: Byte): Boolean;
var
  Err: Integer;
begin
  Val(S, B, Err);
  Result := (Err = 0);
end;
{$R-}
function TryStrToByte_RangeCheck_OFF(const S: String; out B: Byte): Boolean;
var
  Err: Integer;
begin
  Val(S, B, Err);
  Result := (Err = 0);
end;
{$POP}

var
  B: Byte;
  Err: Integer;
begin
  {$PUSH}
  {$R+}
  writeln('Val()');
  writeln('RangeCheck ON');
  Val('256', B, Err);
  writeln('Err=',Err);
  if (Err=0) then writeln('B=',B);
  {$R-}
  writeln('RangeCheck OFF');
  Val('256', B, Err);
  writeln('Err=',Err);
  if (Err=0) then writeln('B=',B);
  {$POP}

  writeln;

  writeln('TryStrToByte_RangeCheck_ON');
  try
    if TryStrToByte_RangeCheck_ON('256', B) then writeln('Ok [',B,']')
else writeln('NOT a Byte');
  except
    on E: Exception do writeln(E.ToString);
  end;

  writeln('TryStrToByte_RangeCheck_OFF');
  try
    if TryStrToByte_RangeCheck_OFF('256', B) then writeln('Ok
[',B,']') else writeln('NOT a Byte');
  except
    on E: Exception do writeln(E.ToString);
  end;
end.
===========

C:\Users\Bart\LazarusProjecten\ConsoleProjecten>fpc test.pas -Mobjfpc
Free Pascal Compiler version 3.3.1 [2026/04/05] for i386
Copyright (c) 1993-2026 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling test.pas
Linking test.exe
56 lines compiled, 0.1 sec, 75632 bytes code, 4804 bytes data

C:\Users\Bart\LazarusProjecten\ConsoleProjecten>test
Val()
RangeCheck ON
Err=3
RangeCheck OFF
Err=3

TryStrToByte_RangeCheck_ON
NOT a Byte
TryStrToByte_RangeCheck_OFF
NOT a Byte


C:\Users\Bart\LazarusProjecten\ConsoleProjecten>fpc test.pas -Mobjfpc -Sh
Free Pascal Compiler version 3.3.1 [2026/04/05] for i386
Copyright (c) 1993-2026 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling test.pas
Linking test.exe
56 lines compiled, 0.1 sec, 75728 bytes code, 4804 bytes data

C:\Users\Bart\LazarusProjecten\ConsoleProjecten>test
Val()
RangeCheck ON
Err=3
RangeCheck OFF
Err=3

TryStrToByte_RangeCheck_ON
ERangeError: Range check error
TryStrToByte_RangeCheck_OFF
Ok [0]



C:\Users\Bart\LazarusProjecten\ConsoleProjecten>fpc test.pas -MDelphi
Free Pascal Compiler version 3.3.1 [2026/04/05] for i386
Copyright (c) 1993-2026 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling test.pas
Linking test.exe
56 lines compiled, 0.2 sec, 75728 bytes code, 4804 bytes data

C:\Users\Bart\LazarusProjecten\ConsoleProjecten>test
Val()
RangeCheck ON
Err=3
RangeCheck OFF
Err=3

TryStrToByte_RangeCheck_ON
ERangeError: Range check error
TryStrToByte_RangeCheck_OFF
Ok [0]



Val() in the main begin end. behaves as expected regardless of
RangeChecking and AnsiString/ShortString.
Val() inside the 2 functions depens on AnsiString/ShortString and RangeChecking?

I'm confused.
PEBKAC (been staring at this way too long, so quite possible),
intended behaviour or bug?

-- 
Bart


More information about the fpc-devel mailing list