Alexander Sviridenkov 357 Posted December 18, 2020 Looks like there is bug in 10.3 Linux compiler: maximum enum size is limited to 8 bytes. F.e. type TMyEnum = (a1, a2, ..a100); TMyEnums = set of TMyEnum; var X: TMyEnums; sizeof(X) returns 8 on Linux platform. Share this post Link to post
Lars Fosdal 1792 Posted December 18, 2020 Is there a QP report for this? Share this post Link to post
Lars Fosdal 1792 Posted December 18, 2020 program LargeEnumSet; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type TLargeEnum = ( e000, e001, e002, e003, e004, e005, e006, e007, e008, e009, e010, e011, e012, e013, e014, e015, e016, e017, e018, e019, e020, e021, e022, e023, e024, e025, e026, e027, e028, e029, e030, e031, e032, e033, e034, e035, e036, e037, e038, e039, e040, e041, e042, e043, e044, e045, e046, e047, e048, e049, e050, e051, e052, e053, e054, e055, e056, e057, e058, e059, e060, e061, e062, e063, e064, e065, e066, e067, e068, e069, e070, e071, e072, e073, e074, e075, e076, e077, e078, e079, e080, e081, e082, e083, e084, e085, e086, e087, e088, e089, e090, e091, e092, e093, e094, e095, e096, e097, e098, e099, e100, e101, e102, e103, e104, e105, e106, e107, e108, e109, e110, e111, e112, e113, e114, e115, e116, e117, e118, e119, e120, e121, e122, e123, e124, e125, e126, e127, e128, e129, e130, e131, e132, e133, e134, e135, e136, e137, e138, e139, e140, e141, e142, e143, e144, e145, e146, e147, e148, e149, e150, e151, e152, e153, e154, e155, e156, e157, e158, e159, e160, e161, e162, e163, e164, e165, e166, e167, e168, e169, e170, e171, e172, e173, e174, e175, e176, e177, e178, e179, e180, e181, e182, e183, e184, e185, e186, e187, e188, e189, e190, e191, e192, e193, e194, e195, e196, e197, e198, e199 ); TLargeEnumSet = Set of TLargeEnum; procedure TestLargeEnum; var LargeEnumSet: TLargeEnumSet; Enum: TLargeEnum; begin LargeEnumSet := [e011, e031, e051, e071, e091, e111, e131, e151, e171, e191]; Writeln('SizeOf = ', SizeOf(LargeEnumSet)); for Enum in LargeEnumSet do Write(Ord(Enum),' '); Writeln; end; begin try try TestLargeEnum; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; finally Write('Press Enter: '); Readln; end; end. output on Win32 and Win64 Quote SizeOf = 25 11 31 51 71 91 111 131 151 171 191 Press Enter: What is the output on Linux? Share this post Link to post
Alexander Sviridenkov 357 Posted December 18, 2020 Output is the same, but in debugger Evaluate/Modify window Sizeof(LargeEnumSet) shows 8. Sizeof(LargeEnumSet) is calculated at compile time, in asm code there is explicit $19 Share this post Link to post
Alexander Sviridenkov 357 Posted December 18, 2020 Another test: if e191 in LargeEnumSet then Writeln('YES'); No YES in output. Share this post Link to post
Lars Fosdal 1792 Posted December 18, 2020 You should register a QP, unless there already is one. Share this post Link to post
Lars Fosdal 1792 Posted December 18, 2020 Eval looks ok on Windows. and your added e191 test writes a yes Share this post Link to post
Lars Fosdal 1792 Posted December 18, 2020 What happens on Android, MacOS or iOS? Those are also LLVM compilers. Share this post Link to post
Stano 143 Posted December 18, 2020 Unfortunately, the debugger often shows incorrect values Share this post Link to post
Guest Posted December 18, 2020 (edited) Changing "this setup" have some relevance for your case? Double Word = LongInt (if I dont wrong) - non-signed = SizeOf = 4bytes = 2^32-1 ... 0 to 4,294,967,295 = Cardinal using "Minimum enum size = Double Word", the "type" have 4bytes of size - not a "var" !!! as necessary "re-build" the .DCU to recreate new compiled code! hug Edited December 18, 2020 by Guest Share this post Link to post
Alexander Sviridenkov 357 Posted December 18, 2020 How mininum enume size may affect this case? This test enum is larger than maximum setting for "Minimum enum size" parameter. Share this post Link to post
Guest Posted December 18, 2020 (edited) 14 minutes ago, Alexander Sviridenkov said: How mininum enume size may affect this case? This test enum is larger than maximum setting for "Minimum enum size" parameter. did you test it in your Linux 64? have a relevance in your resulted? Quote maybe "minimun" would stay better if "maximun" but... is a Embarcadero domain! Edited December 18, 2020 by Guest Share this post Link to post
Attila Kovacs 629 Posted December 18, 2020 @emailx45 {$Z1} / {$Z2} / {$Z4} Share this post Link to post
Guest Posted December 18, 2020 for "specific point", yes. for all project, better on .dproj Share this post Link to post