This question is not directly related to FPC, but it is instead a Pascal question in general.

Take this record definition:

type S1 = record
            X : CHAR ( 27 ) ;
            case INTEGER of
              1 :
                ( V : INTEGER ) ;
              2 :
                ( W : REAL ) ;
              3 :
                ( Z : CHAR ( 8 ) ) ;
          end ;

CHAR (n) is an abbreviation for /* packed */ array [1..n] of char
which is accepted by a certain compiler.

Now the question:

X needs 27 bytes, so the variant part of the record starts at offset 27.
But on a certain platform V has alignment 4 (integer), W has alignment 8 (real). The compiler decided to put V on offset 28, W on offset 32 and Z (no alignment)
on offset 27, so the three variants don't overlay properly.

IMO, the variants in a variant record should always overlay correctly (like unions in C), so the variant part should start at offset 32 in this case, and this is where all three
variants should start.

In other words: every record (in classical Pascal) consists of a fixed part and a variant part and a fixed border between the two (that's how it should be, IMO). And this border takes its alignment properties from the highest alignment of the fields in the variant part.

What do you think?

Why is this important to me? Because I am working on a WITH extension for record definitions, which allows the integration of the components from other record and pointer types into the current record type namespace, and this has to be fixed, before I can do this.

BTW: is there a forum to discuss general Pascal questions not directly related to the FPC product? FPC-Pascal will sure be the largest auditorium available for such questions ...

Thank you, kind regards

Bernd

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to