[Oberon] Type compatibility rules for Pointers

Andreas Pirklbauer andreas_pirklbauer at yahoo.com
Mon Jun 15 22:04:23 CEST 2020


    > TYPE
    >    R = RECORD i : INTEGER END;
    >    P1 = POINTER TO R;
    >    P2 = POINTER TO R;
    >
    > VAR p1 : P1; p2 : P2;
    >
    > I am a bit confused that p1 := p2 compiles without errors. 

Hi Chris,

The two types p1 and p2 are compatible because the *base* types (which
in this example is R in both cases) are compatible.

Section 6.4. on p.5. of the Oberon-07 language report it states: "Pointer types
inherit the extension relation of their base types, if there is any.” See [*] below.

So far so good. So this part of the language report clearly defines P2 to
be an extension of P1 and therefore IF p1 IS P2 THEN (* true *) END,
as you have correctly noted.

But it looks like exception 3 in ch. 9.1. on page 9 should perhaps be modified

From:

    “3. In the case of records, the type of the source must be an extension 
    of the type of the destination." 

To:

    “3. In the case of records or pointers, the type of the source must
    be an extension  of the type of the destination." 

That should do the trick - BECAUSE we also have the rule "Pointer types
inherit the extension relation of their base types, if there is any.”

Andreas

—————————————————————————————————————————————————

[*] PS: You can easily trace this case in the compiler as well:

When you write p1 := p2, two items x and y get created in StatSequence:

    item x for p1 with x.type = P1
    item y for p2 with y.type = P2

Now CompTypes(P1, P2, FALSE) is called in StatSequence.

Since P1 # P2, CompTypes now calls IsExtension(P1.base, P2.base) 
which is of course IsExtension(R, R) which in turn is obviously TRUE.

See the code of CompTypes:

  PROCEDURE CompTypes(t0, t1: ORB.Type; varpar: BOOLEAN): BOOLEAN;
  BEGIN 
    RETURN (t0 = t1)    
      ...
      OR ~varpar & 
        ((t0.form = ORB.Pointer) & (t1.form = ORB.Pointer)  & IsExtension(t0.base, t1.base)



More information about the Oberon mailing list