Invalid use of the SUPER keyword

The SUPER keyword provides access to members of a parent POU (Program Organization Unit) in an inheritance hierarchy. However, there are several rules governing its proper use:

Common errors

  1. Using SUPER in a POU that doesn't extend another POU:
    The SUPER keyword can only be used inside a POU that directly extends another POU through the EXTENDS keyword.

  2. Not dereferencing SUPER to access members:
    When accessing members of a superclass, SUPER must be dereferenced using the ^ operator: SUPER^.member.

  3. Chaining SUPER references:
    SUPER cannot be accessed as a member of another object. Expressions like SUPER^.SUPER^ are invalid.

  4. Global access position:
    SUPER cannot be used with the global access operator (.SUPER^.member).

  5. Using SUPER with type cast operators:
    The type cast operator (<type>#) cannot be used with SUPER.

Examples of invalid use

// Error: Using SUPER in a POU that doesn't extend another POU
FUNCTION_BLOCK fb
    SUPER^.x := 2;  // Error: Invalid use of `SUPER`
END_FUNCTION_BLOCK

// Error: Not dereferencing SUPER when accessing members
FUNCTION_BLOCK child EXTENDS parent
    SUPER.x := 20;  // Error: `SUPER` must be dereferenced to access its members
END_FUNCTION_BLOCK

// Error: Chaining SUPER references/SUPER in member access
FUNCTION_BLOCK child EXTENDS parent
    x.SUPER^.y := 20;    
    SUPER^.SUPER^.x := 20;  
    // Error: `SUPER` is not allowed in member-access position
END_FUNCTION_BLOCK

// Error: Global access position
FUNCTION_BLOCK child EXTENDS parent
    .SUPER^.x := 20;  // Error: `SUPER` is not allowed in global-access position
END_FUNCTION_BLOCK

// Error: Using SUPER with type cast
FUNCTION_BLOCK child EXTENDS parent
    p := parent#SUPER;  // Error: The `<type>#` operator cannot be used with `SUPER`
END_FUNCTION_BLOCK