Supported RPG Features

A TAG is a branch target anywhere in the body it belongs to, including inside an IF, DOW, DOU, FOR, SELECT, or MONITOR block. GOTO and CABxx reach a nested TAG from inside the same block, from a block nested deeper, or from outside the block entirely.

     C                   EVAL      Count = 1
     C     1             IFEQ      1
     C                   GOTO      SKIP
     C                   EVAL      Count = 99
     C     SKIP          TAG
     C                   ENDIF

Branching into a block skips the block's own entry test. Control lands on the TAG and the remainder of the block body runs; the IF condition or loop condition is not re-evaluated on that entry path, and the block is then left normally:

     C                   EVAL      Count = 1
     C                   GOTO      INSIDE
     C     1             IFEQ      2
     C     INSIDE        TAG
     C                   EVAL      Count = Count + 5
     C                   ENDIF

Count ends at 6 even though the IF condition is false, because the branch never ran the test.

GOTO may not cross the boundary between the mainline calculations and a subroutine, in either direction - a label in a subroutine is reachable only from within that subroutine. GOTO and TAG are fixed-format-only opcodes; they have no free-format spelling.