That offsetof-like trick allows classes where they must be disallowed and disallows where they could be allowed.
Previously on “Offsetof-like Trick”: #39665, #39666.
This code erroneously compiles, as if `Indirect` was a `record` (with extra VMT pointer).
```pascal
type
Indirect = class
hasNoOffsetInMyObj: int32;
end;
PMyObj = ^MyObj;
MyObj = record
c: Indirect;
end;
const
WrongOffset = PtrUint(@PMyObj(nil)^.c.hasNoOffsetInMyObj); // 8 on x64
begin
end.
```
**BUT**, while we at it, I want to make a feature request, too.
Allow classes (and arrays if #39666 will be fixed) as a top-level entity. Presently, this does not compile:
```pascal
type
SomeClass = class
field: int32;
end;
const
FieldOffset = PtrUint(@SomeClass(nil).field);
begin
end.
```
but looking at how ```PtrUint(@PMyObj(nil)^.c.hasNoOffsetInMyObj)``` essentially gave the offset of `hasNoOffsetInMyObj` in `Indirect` instance, there are no obstacles to do it in valid scenarios.
issue