I haven't followed all of the discussion, but here are my two cents anyway.
Variant records are more powerful than C unions, you can do everything with variant records that you can do with C unions and more, because variant record fields are on the same level as the non variant fields:
TTest = record
A: Integer;
case boolean of
True: (BA: Integer);
False: (BB: Double);
End;
Rec.A := 42;
Rec.BB:= 3.14;
In C unions you need an intermediary:
struct {
int A;
union {
int A;
double B;
} B;
} Test;
Test.A =42;
Test.B.B = 3.14
Which you can also do with variant records:
type
TTest = record
A: Integer;
B: record
case Boolean of
True: (A: Integer);
False: (B: Integer);
end;
C: Integer;
end;
So variant records are strictly more powerful than C unions, as they can do everything C unions can and more
And C developers regularly use hacks to try to emulate the pascal behavior, e.g. this is the real current production code used in GLibC
struct in6_addr
{
union
{
uint8_t __u6_addr8[16];
uint16_t __u6_addr16[8];
uint32_t __u6_addr32[4];
} __in6_u;
#define s6_addr __in6_u.__u6_addr8
#ifdef __USE_MISC
# define s6_addr16 __in6_u.__u6_addr16
# define s6_addr32 __in6_u.__u6_addr32
#endif
};
They are using defines for hiding the indirection over the union and to allow to directly use addr.s6_addr, which will be replaced by the preprocessor for addr.__in6_u.__u6_addr8, because they don't have what pascal provides by default.
Why would anyone want a downgrade?
There are a few "problems" I have with variant records. First when using a field for the case, e.g. a boolean value to switch over, there is no way to ensure that you can only access the field when the switch is actually set to the correct value for that field, this would be incredibly useful if there was a way to enable both static analysis checks, as well as runtime checks to ensure this.
Second there are currently no ways to use managed types inside them, when there was a way to ensure that a switch is used correctly, this switch could be used to call the correct initializers and finalizes. This would make variant records so much more useful.
Then the fact that you can only have common fields before the case, and only one case per record is a bit annoying as you have to resort to C style indirection as shown above.
Lastly a shorter syntax, so you don't have to count all your options through would be great, right now when having 5 options you need to prefix them with 1:, 2:, etc. Also the bracketing is kinda weird (but allows for multiple values per field which C style unions don't).