Bug 20339 – isPOD returns true if sizeof is accessed inside struct declaration

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P3
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2019-10-30T20:17:52Z
Last change time
2023-12-21T22:20:18Z
Keywords
pull
Assigned to
No Owner
Creator
Suleyman Sahmi (سليمان السهمي)
See also
https://issues.dlang.org/show_bug.cgi?id=24292

Comments

Comment #0 by sahmi.soulaimane — 2019-10-30T20:17:52Z
``` struct S { pragma(msg, S.sizeof); this(this){} ~this(){} int f; } pragma(msg, __traits(isPOD, S)); ``` output: --- 4LU true --- expected --- 4LU false --- This happening in production code which does more sophisticated things than print sizeof at compile time. I discovered it with `std.uni.Grapheme` from phobos see: https://run.dlang.io/is/Yy8mLt it prints true while the `std.uni.Grapheme` defines the postblit.
Comment #1 by dlang-bot — 2019-10-31T13:54:29Z
@SSoulaimane updated dlang/dmd pull request #10519 "Fix issue 20339 - recalculate isPOD at the end of semantic analysis" fixing this issue: - Fix issue 20339 - Defer isPOD and argtypes calculation till the end of semantic analysis In addition to incorrect results being returned, the ABI is affected with regards to argument passing. https://github.com/dlang/dmd/pull/10519
Comment #2 by dlang-bot — 2023-12-21T12:01:19Z
@tim-dlang created dlang/dmd pull request #15939 "Calculate isPOD without information from semantic run" fixing this issue: - Calculate isPOD without information from semantic run Fix issue 20339 - isPOD returns true if sizeof is accessed inside struct declaration Fix issue 24292 - Struct with destructor wrongly returned in register Function StructDeclaration.isPOD can be called before the semantic run for the struct is finished. It then uses incomplete information about destructors, postblits and copy constructors. The result of isPOD is cached, so later calls will also return the wrong result. This commit changes isPOD, so it uses variables, which are already filled before the semantic run. https://github.com/dlang/dmd/pull/15939
Comment #3 by dlang-bot — 2023-12-21T22:20:18Z
dlang/dmd pull request #15939 "Fixes issues 20339, 24292: Calculate isPOD without information from semantic run" was merged into master: - 3364291b569ea832091f576d354c6e4d598315ab by Tim Schendekehl: Fixes issues 20339, 24292: Calculate isPOD without information from semantic run Issue 20339: isPOD returns true if sizeof is accessed inside struct declaration Issue 24292: Struct with destructor wrongly returned in register Function StructDeclaration.isPOD can be called before the semantic run for the struct is finished. It then uses incomplete information about destructors, postblits and copy constructors. The result of isPOD is cached, so later calls will also return the wrong result. This commit changes isPOD, so it uses variables, which are already filled before the semantic run. https://github.com/dlang/dmd/pull/15939