Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-devel / 2026-10

Val() behaviour in a function depends on LongStrings ON/OFF?

6 messages · 1 person · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Bart

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

Reply by email

Bart
to Bart
This is driving me crazy. Val('256', AByte, Code) should fail.

Same issue with Word, but not with DWord or QWord.

======================
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

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

TryStrToByte_RangeCheck_ON
FAIL !! : ERangeError: Range check error
TryStrToByte_RangeCheck_OFF
FAIL !! [0]
TryStrToByte_SS_RangeCheck_ON
NOT a Byte
TryStrToByte_SS_RangeCheck_OFF
NOT a Byte

-------------------------------------------------- Val(Word)
RangeCheck ON
Err=5
RangeCheck OFF
Err=5
TryStrToWord_RangeCheck_ON
FAIL !! : ERangeError: Range check error
TryStrToByte_RangeCheck_OFF
FAIL !! [0]
TryStrToByte_SS_RangeCheck_ON
NOT a Word
TryStrToByte_SS_RangeCheck_OFF
NOT a Word

-------------------------------------------------- Val(DWord)
RangeCheck ON
Err=10
RangeCheck OFF
Err=10
TryStrToDWord_RangeCheck_ON
NOT a DWord
TryStrToDWord_RangeCheck_OFF
NOT a DWord
TryStrToDWord_SS_RangeCheck_ON
NOT a DWord
TryStrToDWord_SS_RangeCheck_OFF
NOT a DWord

-------------------------------------------------- Val(QWord)
RangeCheck ON
Err=11
RangeCheck OFF
Err=11
TryStrToQWord_RangeCheck_ON
NOT a QWord
TryStrQWord_RangeCheck_OFF
NOT a QWord
TryStrToQWord_SS_RangeCheck_ON
NOT a QWord
TryStrToQWord_SS_RangeCheck_OFF
NOT a QWord

ExceptionCount : 2
WrongValueCount: 2

======================================

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

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

TryStrToByte_RangeCheck_ON
NOT a Byte
TryStrToByte_RangeCheck_OFF
NOT a Byte
TryStrToByte_SS_RangeCheck_ON
NOT a Byte
TryStrToByte_SS_RangeCheck_OFF
NOT a Byte

-------------------------------------------------- Val(Word)
RangeCheck ON
Err=5
RangeCheck OFF
Err=5
TryStrToWord_RangeCheck_ON
NOT a Word
TryStrToByte_RangeCheck_OFF
NOT a Word
TryStrToByte_SS_RangeCheck_ON
NOT a Word
TryStrToByte_SS_RangeCheck_OFF
NOT a Word

-------------------------------------------------- Val(DWord)
RangeCheck ON
Err=10
RangeCheck OFF
Err=10
TryStrToDWord_RangeCheck_ON
NOT a DWord
TryStrToDWord_RangeCheck_OFF
NOT a DWord
TryStrToDWord_SS_RangeCheck_ON
NOT a DWord
TryStrToDWord_SS_RangeCheck_OFF
NOT a DWord

-------------------------------------------------- Val(QWord)
RangeCheck ON
Err=11
RangeCheck OFF
Err=11
TryStrToQWord_RangeCheck_ON
NOT a QWord
TryStrQWord_RangeCheck_OFF
NOT a QWord
TryStrToQWord_SS_RangeCheck_ON
NOT a QWord
TryStrToQWord_SS_RangeCheck_OFF
NOT a QWord

Bart

Reply by email