View Issue Details

IDProjectCategoryView StatusLast Update
0037426FPCCompilerpublic2020-07-30 07:40
ReporterBart Broersma Assigned To 
PrioritynormalSeverityminorReproducibilityalways
Status newResolutionopen 
Platformi386OSWindows 
Product Version3.3.1 
Summary0037426: Internal error 200109221 on Byte.SetBit in a method
DescriptionThis program will trigger an internal error 200109221.

{$mode objfpc}
uses
  SysUtils, Classes;
type

  { TFoo }

  TFoo = class
    procedure Bar;
  end;

var
  AByte: Byte;

{ TFoo }

procedure TFoo.Bar;
begin
  AByte := Byte.SetBit(1);
end;

begin

end.
Steps To ReproduceCompile with either trunk or 3.2.0
Additional InformationThe error seems to be only triggered is the offending code (AByte := Byte.SetBit(1)) is part of a classes method.
In a regular procedure it just fails compilation with "Error: Illegal expression"

Discussed on forum: https://forum.lazarus.freepascal.org/index.php/topic,50705.0.html
TagsNo tags attached.
Fixed in Revision
FPCOldBugId
FPCTarget
Attached Files

Activities

Bart Broersma

2020-07-28 09:05

reporter   ~0124359

Summary should read: Internal error 200109221 on Byte.SetBit in a class method

Thaddy de Koning

2020-07-28 13:18

reporter   ~0124360

Last edited: 2020-07-28 13:20

View 2 revisions

I was never aware setbit() could be used on types. That is not how I designed it. It is meant to be used on vars.
That aside, an internal error should never happen.
Can I have some feedback on how this happened at all? It is not what I wrote.
Bart, do you have more info? You were involved in the original discussion.

It is all simple bit manipulation and should never fail.

Sven Barth

2020-07-29 14:03

manager   ~0124393

@Thaddy: as I wrote on the forum, it's a compiler bug as it shouldn't allow the use of instance methods on the type itself. instead the compiler should error out with "illegal expression" or similar.

jamie philbrook

2020-07-29 22:41

reporter   ~0124405

I would of expected it to start with a 0 value when a Type is used..

 It only makes sense because this way you can assign a byte something from this helper and if you use the TYPE instead of a identifier I expected it to assume a ZERO value to start with and then set the bit..

 Because as pointed out if you do 0.SetBit(1) it does create an entity to start with and so why can't using a TYPE generate a default value, in this case a 0 ?

 Maybe I am expecting too much

Sven Barth

2020-07-30 07:40

manager   ~0124408

Yes, you are expecting too much. Class methods can be used on the type only, instance methods can not.

Issue History

Date Modified Username Field Change
2020-07-27 22:19 Bart Broersma New Issue
2020-07-28 09:05 Bart Broersma Note Added: 0124359
2020-07-28 13:18 Thaddy de Koning Note Added: 0124360
2020-07-28 13:20 Thaddy de Koning Note Edited: 0124360 View Revisions
2020-07-29 14:03 Sven Barth Note Added: 0124393
2020-07-29 22:41 jamie philbrook Note Added: 0124405
2020-07-30 07:40 Sven Barth Note Added: 0124408