diff --git a/gcc/cobol/UAT/failsuite.src/typedef.at b/gcc/cobol/UAT/failsuite.src/typedef.at
index b4f234d08d992cbdbc6884b49e1a3569f567831b..1340e560d400e8ffbd1fd9f9368bd7403affb37a 100644
--- a/gcc/cobol/UAT/failsuite.src/typedef.at
+++ b/gcc/cobol/UAT/failsuite.src/typedef.at
@@ -71,125 +71,125 @@ AT_SETUP([TYPEDEF clause])
 AT_KEYWORDS([definition EXTERNAL GLOBAL TYPE USAGE listing symbols xref])
 
 AT_DATA([prog.cob], [
-      IDENTIFICATION   DIVISION.
-      PROGRAM-ID.      prog.
-      DATA             DIVISION.
-      WORKING-STORAGE  SECTION.
-      01 AUSGABE-FILE-NAME-T          PIC X(50) IS TYPEDEF.
-      01 SOME-VERY-LONG-TYPEDEF-NAME  PIC 9999  IS TYPEDEF.
-      01 AUSGABE-FILE-NAME-2T         IS TYPEDEF.
-         05 FILLER    PIC 9999.
-         05 DETAIL-NO USAGE SOME-VERY-LONG-TYPEDEF-NAME.
-     *
-      01  MESSAGE-TEXT-2T IS TYPEDEF.
-        02 AUSGABE-FILE-NAME     USAGE AUSGABE-FILE-NAME-T.
-        02 FILLER REDEFINES AUSGABE-FILE-NAME.
-            05 FILLER PIC 9999.
-        02 AUSGABE-FILE-NAME-2   USAGE AUSGABE-FILE-NAME-2T.
-        02 FILLER                USAGE AUSGABE-FILE-NAME-T.
-     *
-      01  MESSAGE-TEXT-2 EXTERNAL USAGE MESSAGE-TEXT-2T.
-
-      77 OUTPUT-NAME USAGE SOME-VERY-LONG-TYPEDEF-NAME GLOBAL.
-
-      01 Z-MESSAGE-T2 USAGE AUSGABE-FILE-NAME-2T.
-      01 Z-MESSAGE-T3.
-         49 MT3                    USAGE MESSAGE-TEXT-2T.
-         49 MT3-REN  REDEFINES MT3 USAGE MESSAGE-TEXT-2T.
-
-      01 CALCULUS             PIC S9(15)V9(03) IS TYPEDEF.
-         88 NO-DETAIL         VALUE ZERO.
-         88 MIN-DETAIL        VALUE 0.001.
-      01 USER-TYPE            IS TYPEDEF.
-         02 AMOUNT            USAGE CALCULUS.
-         02 FILLER            OCCURS 100.
-            05 GRP-AMOUNT     USAGE CALCULUS.
-      01 USER-VAR             USAGE USER-TYPE.
-
-      01 PROC                 USAGE PROGRAM-POINTER IS TYPEDEF.
-         88 PROC-UNSET        VALUE NULL.
-      77 MY-PROC              USAGE PROC VALUE NULL.
-
-      PROCEDURE DIVISION.
-          DISPLAY AUSGABE-FILE-NAME OF MESSAGE-TEXT-2
-          DISPLAY DETAIL-NO         OF Z-MESSAGE-T2
-          DISPLAY AUSGABE-FILE-NAME OF MT3
-          DISPLAY OUTPUT-NAME
-          MOVE -123.45 TO AMOUNT
-          MOVE AMOUNT  TO GRP-AMOUNT (1)
-          IF MY-PROC = NULL
-             SET MY-PROC TO ADDRESS OF PROGRAM "prog".
-          GOBACK.
+       IDENTIFICATION   DIVISION.
+       PROGRAM-ID.      prog.
+       DATA             DIVISION.
+       WORKING-STORAGE  SECTION.
+       01 AUSGABE-FILE-NAME-T          PIC X(50) IS TYPEDEF.
+       01 SOME-VERY-LONG-TYPEDEF-NAME  PIC 9999  IS TYPEDEF.
+       01 AUSGABE-FILE-NAME-2T         IS TYPEDEF.
+          05 FILLER    PIC 9999.
+          05 DETAIL-NO USAGE SOME-VERY-LONG-TYPEDEF-NAME.
+      *
+       01  MESSAGE-TEXT-2T IS TYPEDEF.
+         02 AUSGABE-FILE-NAME     USAGE AUSGABE-FILE-NAME-T.
+         02 FILLER REDEFINES AUSGABE-FILE-NAME.
+             05 FILLER PIC 9999.
+         02 AUSGABE-FILE-NAME-2   USAGE AUSGABE-FILE-NAME-2T.
+         02 FILLER                USAGE AUSGABE-FILE-NAME-T.
+      *
+       01  MESSAGE-TEXT-2 EXTERNAL USAGE MESSAGE-TEXT-2T.
+ 
+       77 OUTPUT-NAME USAGE SOME-VERY-LONG-TYPEDEF-NAME GLOBAL.
+ 
+       01 Z-MESSAGE-T2 USAGE AUSGABE-FILE-NAME-2T.
+       01 Z-MESSAGE-T3.
+          49 MT3                    USAGE MESSAGE-TEXT-2T.
+          49 MT3-REN  REDEFINES MT3 USAGE MESSAGE-TEXT-2T.
+ 
+       01 CALCULUS             PIC S9(15)V9(03) IS TYPEDEF.
+          88 NO-DETAIL         VALUE ZERO.
+          88 MIN-DETAIL        VALUE 0.001.
+       01 USER-TYPE            IS TYPEDEF.
+          02 AMOUNT            USAGE CALCULUS.
+          02 FILLER            OCCURS 100.
+             05 GRP-AMOUNT     USAGE CALCULUS.
+       01 USER-VAR             USAGE USER-TYPE.
+ 
+       01 PROC                 USAGE PROGRAM-POINTER IS TYPEDEF.
+          88 PROC-UNSET        VALUE NULL.
+       77 MY-PROC              USAGE PROC VALUE NULL.
+ 
+       PROCEDURE DIVISION.
+           DISPLAY AUSGABE-FILE-NAME OF MESSAGE-TEXT-2
+           DISPLAY DETAIL-NO         OF Z-MESSAGE-T2
+           DISPLAY AUSGABE-FILE-NAME OF MT3
+           DISPLAY OUTPUT-NAME
+           MOVE -123.45 TO AMOUNT
+           MOVE AMOUNT  TO GRP-AMOUNT (1)
+           IF MY-PROC = NULL
+              SET MY-PROC TO ADDRESS OF PROGRAM "prog".
+           GOBACK.
 ])
 
 AT_DATA([progstd.cob], [
-      IDENTIFICATION   DIVISION.
-      PROGRAM-ID.      prog.
-      DATA             DIVISION.
-      WORKING-STORAGE  SECTION.
-      01 AUSGABE-FILE-NAME-T     PIC X(50) IS TYPEDEF.
-      01 DETAIL-NO-T             PIC 9999  IS TYPEDEF.
-      01 AUSGABE-FILE-NAME-2T              IS TYPEDEF.
-         05 FILLER    PIC 9999.
-         05 DETAIL-NO TYPE TO DETAIL-NO-T.
-     *
-      01  MESSAGE-TEXT-2T IS TYPEDEF.
-        02 AUSGABE-FILE-NAME     TYPE AUSGABE-FILE-NAME-T.
-        02 FILLER REDEFINES AUSGABE-FILE-NAME.
-            05 FILLER PIC 9999.
-        02 AUSGABE-FILE-NAME-2   TYPE AUSGABE-FILE-NAME-2T.
-        02 FILLER                TYPE AUSGABE-FILE-NAME-T.
-     *
-      01  MESSAGE-TEXT-2 EXTERNAL TYPE MESSAGE-TEXT-2T.
-
-      77 OUTPUT-NAME TYPE TO DETAIL-NO-T GLOBAL.
-
-      01 Z-MESSAGE-T2 TYPE AUSGABE-FILE-NAME-2T.
-      01 Z-MESSAGE-T3.
-         49 MT3                    TYPE MESSAGE-TEXT-2T.
-         49 MT3-REN  REDEFINES MT3 TYPE MESSAGE-TEXT-2T.
-
-      77 CALCULUS             PIC S9(15)V9(03) IS TYPEDEF.
-
-      01 SOME-STRUCT          IS TYPEDEF.
-         02 SOME-DATA         PIC 9.
-         02 SOME-VALUES       OCCURS 3.
-            03 OTHER-DATA     PIC X.
-            03 OTHER-VALUES   OCCURS 2 PIC 9.
-      77 SOME2-DATA           PIC 9.
-      01 SOME-STRUCT2         IS TYPEDEF.
-         02 SOME2-VALUES      OCCURS 1 TO 6 DEPENDING ON SOME2-DATA
-                              DESCENDING KEY SB SA
-                              INDEXED BY SOME2-INDEX.
-            05 SA             PIC X VALUE x'12'.
-            05 SB             PIC 9 VALUE 0.
-            05 SDATA          PIC X(12).
-
-      01 MY-TEST.
-         02 AMOUNT            TYPE CALCULUS.
-         02 FILLER            OCCURS 100.
-            05 GRP-AMOUNT     TYPE CALCULUS.
-         02 MY-NAME           TYPE SOME-STRUCT  OCCURS 5.
-         02 MY-NAME2          TYPE SOME-STRUCT2.
-      01 MY-TEST2             TYPE SOME-STRUCT2.
-      LINKAGE SECTION.
-      01 MY-STORE             TYPE CALCULUS.
-
-      PROCEDURE DIVISION USING MY-STORE.
-          DISPLAY AUSGABE-FILE-NAME OF MESSAGE-TEXT-2
-          DISPLAY DETAIL-NO         OF Z-MESSAGE-T2
-          DISPLAY AUSGABE-FILE-NAME OF MT3
-          DISPLAY OUTPUT-NAME
-          SET ADDRESS OF MY-STORE TO NULL
-          INITIALIZE MY-NAME(2) GRP-AMOUNT (99)
-          INITIALIZE OTHER-VALUES (2, 3, 2)
-          SEARCH ALL SOME2-VALUES OF MY-NAME2
-            WHEN SA(SOME2-INDEX) = x'12'
-               CONTINUE.
-          GOBACK.
+       IDENTIFICATION   DIVISION.
+       PROGRAM-ID.      prog.
+       DATA             DIVISION.
+       WORKING-STORAGE  SECTION.
+       01 AUSGABE-FILE-NAME-T     PIC X(50) IS TYPEDEF.
+       01 DETAIL-NO-T             PIC 9999  IS TYPEDEF.
+       01 AUSGABE-FILE-NAME-2T              IS TYPEDEF.
+          05 FILLER    PIC 9999.
+          05 DETAIL-NO TYPE TO DETAIL-NO-T.
+      *
+       01  MESSAGE-TEXT-2T IS TYPEDEF.
+         02 AUSGABE-FILE-NAME     TYPE AUSGABE-FILE-NAME-T.
+         02 FILLER REDEFINES AUSGABE-FILE-NAME.
+             05 FILLER PIC 9999.
+         02 AUSGABE-FILE-NAME-2   TYPE AUSGABE-FILE-NAME-2T.
+         02 FILLER                TYPE AUSGABE-FILE-NAME-T.
+      *
+       01  MESSAGE-TEXT-2 EXTERNAL TYPE MESSAGE-TEXT-2T.
+ 
+       77 OUTPUT-NAME TYPE TO DETAIL-NO-T GLOBAL.
+ 
+       01 Z-MESSAGE-T2 TYPE AUSGABE-FILE-NAME-2T.
+       01 Z-MESSAGE-T3.
+          49 MT3                    TYPE MESSAGE-TEXT-2T.
+          49 MT3-REN  REDEFINES MT3 TYPE MESSAGE-TEXT-2T.
+ 
+       77 CALCULUS             PIC S9(15)V9(03) IS TYPEDEF.
+ 
+       01 SOME-STRUCT          IS TYPEDEF.
+          02 SOME-DATA         PIC 9.
+          02 SOME-VALUES       OCCURS 3.
+             03 OTHER-DATA     PIC X.
+             03 OTHER-VALUES   OCCURS 2 PIC 9.
+       77 SOME2-DATA           PIC 9.
+       01 SOME-STRUCT2         IS TYPEDEF.
+          02 SOME2-VALUES      OCCURS 1 TO 6 DEPENDING ON SOME2-DATA
+                               DESCENDING KEY SB SA
+                               INDEXED BY SOME2-INDEX.
+             05 SA             PIC X VALUE x'12'.
+             05 SB             PIC 9 VALUE 0.
+             05 SDATA          PIC X(12).
+ 
+       01 MY-TEST.
+          02 AMOUNT            TYPE CALCULUS.
+          02 FILLER            OCCURS 100.
+             05 GRP-AMOUNT     TYPE CALCULUS.
+          02 MY-NAME           TYPE SOME-STRUCT  OCCURS 5.
+          02 MY-NAME2          TYPE SOME-STRUCT2.
+       01 MY-TEST2             TYPE SOME-STRUCT2.
+       LINKAGE SECTION.
+       01 MY-STORE             TYPE CALCULUS.
+ 
+       PROCEDURE DIVISION USING MY-STORE.
+           DISPLAY AUSGABE-FILE-NAME OF MESSAGE-TEXT-2
+           DISPLAY DETAIL-NO         OF Z-MESSAGE-T2
+           DISPLAY AUSGABE-FILE-NAME OF MT3
+           DISPLAY OUTPUT-NAME
+           SET ADDRESS OF MY-STORE TO NULL
+           INITIALIZE MY-NAME(2) GRP-AMOUNT (99)
+           INITIALIZE OTHER-VALUES (2, 3, 2)
+           SEARCH ALL SOME2-VALUES OF MY-NAME2
+             WHEN SA(SOME2-INDEX) = x'12'
+                CONTINUE.
+           GOBACK.
 ])
 
-AT_CHECK([$COMPILE_ONLY prog.cob], [0], [], [])
+AT_CHECK([$COMPILE_ONLY -dialect mf prog.cob], [0], [], [])
 AT_CLEANUP
 
 AT_SETUP([typedef 1])
@@ -197,17 +197,17 @@ AT_SETUP([typedef 1])
 AT_KEYWORDS([typedef])
 
 AT_DATA([badprog.cob], [
-      IDENTIFICATION   DIVISION.
-      PROGRAM-ID.      prog.
-      DATA             DIVISION.
-      WORKING-STORAGE  SECTION.
-      01  MESSAGE-TEXT-2T IS TYPEDEF.
-        02 AUSGABE-FILE-NAME     PIC X(50).
-        02 F1      USAGE MESSAGE-TEXT-2T.
-      01 MT2 USAGE MESSAGE-TEXT-2T.
-            05 FILLER PIC 9999.
-      01 MT3 TYPE TO MESSAGE-TEXT-2T PIC X.
-      77 OUTPUT-NAME  TYPE TO MESSAGE-TEXT-2T.
+       IDENTIFICATION   DIVISION.
+       PROGRAM-ID.      prog.
+       DATA             DIVISION.
+       WORKING-STORAGE  SECTION.
+       01  MESSAGE-TEXT-2T IS TYPEDEF.
+         02 AUSGABE-FILE-NAME     PIC X(50).
+         02 F1      USAGE MESSAGE-TEXT-2T.
+       01 MT2 USAGE MESSAGE-TEXT-2T.
+             05 FILLER PIC 9999.
+       01 MT3 TYPE TO MESSAGE-TEXT-2T PIC X.
+       77 OUTPUT-NAME  TYPE TO MESSAGE-TEXT-2T.
 ])
 
 
@@ -223,46 +223,46 @@ AT_SETUP([SAME AS clause])
 AT_KEYWORDS([definition EXTERNAL GLOBAL])
 
 AT_DATA([prog.cob], [
-      IDENTIFICATION   DIVISION.
-      PROGRAM-ID.      prog.
-      DATA             DIVISION.
-      WORKING-STORAGE  SECTION.
-      01  MESSAGE-TEXT-2 EXTERNAL.
-        02 AUSGABE-FILE-NAME   PIC X(50).
-        02 FILLER REDEFINES AUSGABE-FILE-NAME.
-            05 FILLER          PIC 9999.
-        02 AUSGABE-FILE-NAME-2.
-            05 FILLER          PIC 9999.
-            05 DETAIL-NO       PIC 9999.
-        02 FILLER SAME AS AUSGABE-FILE-NAME.
-
-      77 OUTPUT-NAME SAME AS DETAIL-NO GLOBAL.
-
-      01 Z-MESSAGE-T2 SAME AS AUSGABE-FILE-NAME-2.
-      01 Z-MESSAGE-T3.
-         49 MT3       SAME AS MESSAGE-TEXT-2.
-         49 MT3-REN  REDEFINES MT3 SAME AS MESSAGE-TEXT-2.
-
-      PROCEDURE DIVISION.
-          DISPLAY AUSGABE-FILE-NAME OF MESSAGE-TEXT-2
-          DISPLAY DETAIL-NO         OF Z-MESSAGE-T2
-          DISPLAY AUSGABE-FILE-NAME OF MT3
-          DISPLAY OUTPUT-NAME
-          GOBACK.
+       IDENTIFICATION   DIVISION.
+       PROGRAM-ID.      prog.
+       DATA             DIVISION.
+       WORKING-STORAGE  SECTION.
+       01  MESSAGE-TEXT-2 EXTERNAL.
+         02 AUSGABE-FILE-NAME   PIC X(50).
+         02 FILLER REDEFINES AUSGABE-FILE-NAME.
+             05 FILLER          PIC 9999.
+         02 AUSGABE-FILE-NAME-2.
+             05 FILLER          PIC 9999.
+             05 DETAIL-NO       PIC 9999.
+         02 FILLER SAME AS AUSGABE-FILE-NAME.
+
+       77 OUTPUT-NAME SAME AS DETAIL-NO GLOBAL.
+
+       01 Z-MESSAGE-T2 SAME AS AUSGABE-FILE-NAME-2.
+       01 Z-MESSAGE-T3.
+          49 MT3       SAME AS MESSAGE-TEXT-2.
+          49 MT3-REN  REDEFINES MT3 SAME AS MESSAGE-TEXT-2.
+
+       PROCEDURE DIVISION.
+           DISPLAY AUSGABE-FILE-NAME OF MESSAGE-TEXT-2
+           DISPLAY DETAIL-NO         OF Z-MESSAGE-T2
+           DISPLAY AUSGABE-FILE-NAME OF MT3
+           DISPLAY OUTPUT-NAME
+           GOBACK.
 ])
 
 AT_DATA([badprog.cob], [
-      IDENTIFICATION   DIVISION.
-      PROGRAM-ID.      prog.
-      DATA             DIVISION.
-      WORKING-STORAGE  SECTION.
-      01  MESSAGE-TEXT-2.
-        02 AUSGABE-FILE-NAME                 PIC X(50).
-        02 F1         SAME AS MESSAGE-TEXT-2.
-      01 MT2          SAME AS MESSAGE-TEXT-2.
-            05 FILLER                        PIC 9999.
-      01 MT3          SAME AS MESSAGE-TEXT-2 PIC X.
-      77 OUTPUT-NAME  SAME AS MESSAGE-TEXT-2.
+       IDENTIFICATION   DIVISION.
+       PROGRAM-ID.      prog.
+       DATA             DIVISION.
+       WORKING-STORAGE  SECTION.
+       01  MESSAGE-TEXT-2.
+         02 AUSGABE-FILE-NAME                 PIC X(50).
+         02 F1         SAME AS MESSAGE-TEXT-2.
+       01 MT2          SAME AS MESSAGE-TEXT-2.
+             05 FILLER                        PIC 9999.
+       01 MT3          SAME AS MESSAGE-TEXT-2 PIC X.
+       77 OUTPUT-NAME  SAME AS MESSAGE-TEXT-2.
 ])
 
 AT_CHECK([$COMPILE_ONLY prog.cob], [0], [], [])
@@ -286,136 +286,136 @@ AT_SETUP([typedef 1])
 AT_KEYWORDS([typedef])
 
 AT_DATA([prog.cob], [
-      IDENTIFICATION DIVISION.
-      PROGRAM-ID. prog.
-      DATA  DIVISION.
-      WORKING-STORAGE SECTION.
-  *> D.22.7.1    Example of validation of USAGE DISPLAY items
-  *>
-  *>*************************************************************
-  *>Description of target record (note: should be possible to define later)
-  *>*************************************************************
-  *>This is set up by the optional DESTINATION clauses defined
-  *>in the input record;
-  *>if a format error is found, a default value is stored instead.
-   01  TARGET-AREA.
-       05  OUT-NAME       PIC X(20).
-       05  OUT-WEEK       PIC 99 COMP   OCCURS 5.
-  *>*************************************************************
-  *>Validated items
-  *>*************************************************************
-   01  INPUT-RECORD.
-  *>PIC 99 checks that IN-TYPE is 2 characters numeric;
-       03  IN-TYPE         PIC 99
-  *>if IN-TYPE fails the PICTURE check, it is assumed to be 1;
-  *>without a DEFAULT clause, the assumed value would here be 0.
-                               DEFAULT 1.
-  *>PRESENT WHEN states the condition for this format to be used.
-       03  IN-REC-FORMAT-1 PRESENT WHEN IN-TYPE = 0 OR 1 OR 2.
-  *>PICTURE A(20) checks for 20 alphabetic (or space) characters.
-           05  IN-NAME       PIC A(20)
-  *>PRESENT WHEN defines when the validation clauses for this data item apply:
-                                PRESENT WHEN IN-TYPE = 0 OR 1
-  *>CLASS checks each character for a class defined in SPECIAL-NAMES
-  *>or a predefined class
-                                CLASS IS ALPHABETIC-UPPER
-  *>DESTINATION moves this item (or spaces if not alpha) to OUT-NAME.
-                                DESTINATION OUT-NAME.
-  *>PRESENT WHEN checks whether the item is "blank" under this condition
-           05  FILLER REDEFINES IN-NAME  PIC X(20) *> should PIC be optional?
-                                PRESENT WHEN IN-TYPE = 2
-                                DESTINATION OUT-NAME.
-               88               VALUE SPACES IS VALID.
-  *>The values of IN-WEEK are checked to be in non-descending order.
-           05  IN-WEEK       PIC 99  OCCURS 5
-               VARYING IN-WEEK-NO FROM 1, IN-NEXT-WEEK-NO FROM 2
-               INVALID WHEN IN-WEEK-NO < 5
-               AND IN-WEEK (IN-WEEK-NO) > IN-WEEK (IN-NEXT-WEEK-NO)
-  *>OUT-WEEK (1) to (5) will hold the values of IN-WEEK (1) to (5),
-  *>or zero for any one that failed the format (PICTURE) test.
-               DESTINATION OUT-WEEK (IN-WEEK-NO).
-  *>The 88-level INVALID entries check for invalid ranges of values.
-              88  VALUES 0, 53 THRU 99 ARE INVALID.
-  *>REDEFINES and another PRESENT WHEN define an alternate format.
-       03  IN-REC-FORMAT-2 REDEFINES IN-REC-FORMAT-1
-                                       PRESENT WHEN IN-TYPE > 2.
-  *>IN-PAY has insertion characters that must be present on input.
-           05  IN-PAY                PIC ZZ,ZZZ.ZZ.
-  *>The 88-level VALID entries check for valid ranges of values;
-  *>the condition-name, if present, may be used in the usual way.
-  *>The following assume that DECIMAL POINT IS COMMA is not specified.
-                88  IN-PAY-OK  VALUES "10,000.00" THRU "20,000.00" ARE VALID.
-  *>88-level entries may also have a condition attached.
-                88                    VALUES "20,000.01" THRU "30,000.00" ARE VALID
-                                      WHEN IN-TYPE = 8.
-  *>exceptional cases can be specified using PRESENT WHEN
-           05  IN-CODE                PIC AX(3)9(4)
-                                      PRESENT WHEN IN-CODE NOT = "UNKNOWN".
-           05  FILLER           PIC X(13).
-  *>
-  *>*************************************************************
-  *> Description of error messages
-  *>*************************************************************
-  *>Error messages or flags are set up or cleared automatically
-  *>when the VALIDATE statement is executed; the programmer chooses
-  *>where they go and what messages or values they contain;
-  *>they need not be contiguous as they are in this example.
-  01  VALIDATE-MESSAGES.
-      03  PIC X(40)  VALIDATE-STATUS "Unknown Record Type - 1 assumed"
-                       WHEN ERROR FOR IN-TYPE
-  *> more than one VALIDATE-STATUS clause may be defined in one entry;
-  *> a NO ERROR  phrase produces a message when the item is valid.
-                     VALIDATE-STATUS "Record type Accepted"
-                       WHEN NO ERROR FOR IN-TYPE.
-  *> The VALIDATE-STATUS clause can pinpoint the stage of the failed check.
-      03  PIC X(40)  VALIDATE-STATUS "Name not alphabetic"
-                       WHEN ERROR ON FORMAT FOR IN-NAME
-                     VALIDATE-STATUS "Lower-case not allowed in name"
-                       WHEN ERROR ON CONTENT FOR IN-NAME
-                     VALIDATE-STATUS "Name not allowed in this case"
-                       WHEN ERROR ON RELATION FOR IN-NAME.
-  *> If no message is stored, spaces will be stored in these cases.
-  *> Errors may also be indicated by flags;
-  *> they may also refer to a table of input items.
-      03  W-ERROR-FLAG   PIC 9   COMP  OCCURS 5
-                     VALIDATE-STATUS 1 WHEN ERROR FOR IN-WEEK.
-  *>An EC-VALIDATE (nonfatal) exception is also set if the
-  *>VALIDATE statement detects an invalid condition.
-
-
-  *> From D.22.7.2    Example of validation of non-display items:
-     01  MIXED-GROUP TYPEDEF STRONG.
-         05  FLD-1             PIC S9(4)  USAGE COMP.
-         05  FLD-2             PIC S9(7)  USAGE PACKED-DECIMAL.
-         05  FLD-3             PIC 1(8)   USAGE BIT ALIGNED.
-         05  PTR-1             USAGE INDEX.
-         05  PTR-2             USAGE OBJECT REFERENCE.
-         05  TXT-1             PIC N(12)  USAGE NATIONAL.
-   01 MY-MIXED-GROUP TYPE MIXED-GROUP.
-
-
-  *>
-  *>*************************************************************
-  *>Execution of the VALIDATE statement
-  *>*************************************************************
-   PROCEDURE DIVISION.
-
-  *>A single VALIDATE statement performs all the actions implied
-  *>in the above data descriptions.
-       VALIDATE INPUT-RECORD
-  *>After this statement has been executed:
-  *>(1) the input record is unchanged;
-  *>(2) input items are moved automatically to the target area;
-  *>(3) error messages are set up wherever specified in the program.
-  *>
-
-  *> From D.22.7.2    Example of validation of non-display items:
-  *>A declarative section could be used instead of VALIDATE-STATUS clauses
-  *>especially if errors are not expected.
-  *>> TURN EC-VALIDATE CHECKING ON
-       VALIDATE MY-MIXED-GROUP
-
-    GOBACK.
+       IDENTIFICATION DIVISION.
+       PROGRAM-ID. prog.
+       DATA  DIVISION.
+       WORKING-STORAGE SECTION.
+      *> D.22.7.1    Example of validation of USAGE DISPLAY items
+      *>
+      *>*************************************************************
+      *>Description of target record (note: should be possible to define later)
+      *>*************************************************************
+      *>This is set up by the optional DESTINATION clauses defined
+      *>in the input record;
+      *>if a format error is found, a default value is stored instead.
+       01  TARGET-AREA.
+           05  OUT-NAME       PIC X(20).
+           05  OUT-WEEK       PIC 99 COMP   OCCURS 5.
+      *>*************************************************************
+      *>Validated items
+      *>*************************************************************
+       01  INPUT-RECORD.
+      *>PIC 99 checks that IN-TYPE is 2 characters numeric;
+           03  IN-TYPE         PIC 99
+      *>if IN-TYPE fails the PICTURE check, it is assumed to be 1;
+      *>without a DEFAULT clause, the assumed value would here be 0.
+                                   DEFAULT 1.
+      *>PRESENT WHEN states the condition for this format to be used.
+           03  IN-REC-FORMAT-1 PRESENT WHEN IN-TYPE = 0 OR 1 OR 2.
+      *>PICTURE A(20) checks for 20 alphabetic (or space) characters.
+               05  IN-NAME       PIC A(20)
+      *>PRESENT WHEN defines when the validation clauses for this data item apply:
+                                    PRESENT WHEN IN-TYPE = 0 OR 1
+      *>CLASS checks each character for a class defined in SPECIAL-NAMES
+      *>or a predefined class
+                                    CLASS IS ALPHABETIC-UPPER
+      *>DESTINATION moves this item (or spaces if not alpha) to OUT-NAME.
+                                    DESTINATION OUT-NAME.
+      *>PRESENT WHEN checks whether the item is "blank" under this condition
+               05  FILLER REDEFINES IN-NAME  PIC X(20) *> should PIC be optional?
+                                    PRESENT WHEN IN-TYPE = 2
+                                    DESTINATION OUT-NAME.
+                   88               VALUE SPACES IS VALID.
+      *>The values of IN-WEEK are checked to be in non-descending order.
+               05  IN-WEEK       PIC 99  OCCURS 5
+                   VARYING IN-WEEK-NO FROM 1, IN-NEXT-WEEK-NO FROM 2
+                   INVALID WHEN IN-WEEK-NO < 5
+                   AND IN-WEEK (IN-WEEK-NO) > IN-WEEK (IN-NEXT-WEEK-NO)
+      *>OUT-WEEK (1) to (5) will hold the values of IN-WEEK (1) to (5),
+      *>or zero for any one that failed the format (PICTURE) test.
+                   DESTINATION OUT-WEEK (IN-WEEK-NO).
+      *>The 88-level INVALID entries check for invalid ranges of values.
+                  88  VALUES 0, 53 THRU 99 ARE INVALID.
+      *>REDEFINES and another PRESENT WHEN define an alternate format.
+           03  IN-REC-FORMAT-2 REDEFINES IN-REC-FORMAT-1
+                                           PRESENT WHEN IN-TYPE > 2.
+      *>IN-PAY has insertion characters that must be present on input.
+               05  IN-PAY                PIC ZZ,ZZZ.ZZ.
+      *>The 88-level VALID entries check for valid ranges of values;
+      *>the condition-name, if present, may be used in the usual way.
+      *>The following assume that DECIMAL POINT IS COMMA is not specified.
+                    88  IN-PAY-OK  VALUES "10,000.00" THRU "20,000.00" ARE VALID.
+      *>88-level entries may also have a condition attached.
+                    88                    VALUES "20,000.01" THRU "30,000.00" ARE VALID
+                                          WHEN IN-TYPE = 8.
+      *>exceptional cases can be specified using PRESENT WHEN
+               05  IN-CODE                PIC AX(3)9(4)
+                                          PRESENT WHEN IN-CODE NOT = "UNKNOWN".
+               05  FILLER           PIC X(13).
+      *>
+      *>*************************************************************
+      *> Description of error messages
+      *>*************************************************************
+      *>Error messages or flags are set up or cleared automatically
+      *>when the VALIDATE statement is executed; the programmer chooses
+      *>where they go and what messages or values they contain;
+      *>they need not be contiguous as they are in this example.
+      01  VALIDATE-MESSAGES.
+          03  PIC X(40)  VALIDATE-STATUS "Unknown Record Type - 1 assumed"
+                           WHEN ERROR FOR IN-TYPE
+      *> more than one VALIDATE-STATUS clause may be defined in one entry;
+      *> a NO ERROR  phrase produces a message when the item is valid.
+                         VALIDATE-STATUS "Record type Accepted"
+                           WHEN NO ERROR FOR IN-TYPE.
+      *> The VALIDATE-STATUS clause can pinpoint the stage of the failed check.
+          03  PIC X(40)  VALIDATE-STATUS "Name not alphabetic"
+                           WHEN ERROR ON FORMAT FOR IN-NAME
+                         VALIDATE-STATUS "Lower-case not allowed in name"
+                           WHEN ERROR ON CONTENT FOR IN-NAME
+                         VALIDATE-STATUS "Name not allowed in this case"
+                           WHEN ERROR ON RELATION FOR IN-NAME.
+      *> If no message is stored, spaces will be stored in these cases.
+      *> Errors may also be indicated by flags;
+      *> they may also refer to a table of input items.
+          03  W-ERROR-FLAG   PIC 9   COMP  OCCURS 5
+                         VALIDATE-STATUS 1 WHEN ERROR FOR IN-WEEK.
+      *>An EC-VALIDATE (nonfatal) exception is also set if the
+      *>VALIDATE statement detects an invalid condition.
+
+
+      *> From D.22.7.2    Example of validation of non-display items:
+         01  MIXED-GROUP TYPEDEF STRONG.
+             05  FLD-1             PIC S9(4)  USAGE COMP.
+             05  FLD-2             PIC S9(7)  USAGE PACKED-DECIMAL.
+             05  FLD-3             PIC 1(8)   USAGE BIT ALIGNED.
+             05  PTR-1             USAGE INDEX.
+             05  PTR-2             USAGE OBJECT REFERENCE.
+             05  TXT-1             PIC N(12)  USAGE NATIONAL.
+       01 MY-MIXED-GROUP TYPE MIXED-GROUP.
+
+
+      *>
+      *>*************************************************************
+      *>Execution of the VALIDATE statement
+      *>*************************************************************
+       PROCEDURE DIVISION.
+
+      *>A single VALIDATE statement performs all the actions implied
+      *>in the above data descriptions.
+           VALIDATE INPUT-RECORD
+      *>After this statement has been executed:
+      *>(1) the input record is unchanged;
+      *>(2) input items are moved automatically to the target area;
+      *>(3) error messages are set up wherever specified in the program.
+      *>
+
+      *> From D.22.7.2    Example of validation of non-display items:
+      *>A declarative section could be used instead of VALIDATE-STATUS clauses
+      *>especially if errors are not expected.
+      *>> TURN EC-VALIDATE CHECKING ON
+           VALIDATE MY-MIXED-GROUP
+
+        GOBACK.
 ])
 
 AT_CLEANUP
diff --git a/gcc/cobol/genapi.cc b/gcc/cobol/genapi.cc
index 16a647c0547e2b6ff30c96a3ecfcea5962f510d4..d25008bf823837b60283e791e9dc1bf4c4a0ba26 100644
--- a/gcc/cobol/genapi.cc
+++ b/gcc/cobol/genapi.cc
@@ -11448,7 +11448,7 @@ parser_set_pointers( size_t ntgt, cbl_refer_t *tgts, cbl_refer_t source )
         gcc_assert( tgts[i].field->attr & (linkage_e | based_e) );
         }
 
-      if( source.field && !source.addr_of )
+      if( (source.field || source.prog_func) && !source.addr_of )
         {
         // When not ADDRESS OF SOURCE, the variable must be a POINTER
         gcc_assert( source.field->type == FldPointer );
diff --git a/gcc/cobol/genapi.h b/gcc/cobol/genapi.h
index 7afd147950d6355846a4f127cb7382a3fa81941d..30576cf26bfd680046a11a52c5577d6b3f0387c9 100644
--- a/gcc/cobol/genapi.h
+++ b/gcc/cobol/genapi.h
@@ -146,7 +146,7 @@ parser_divide( struct cbl_refer_t quotient,
                struct cbl_refer_t divisor,
                struct cbl_refer_t dividend,
                enum cbl_round_t = truncation_e,
-               struct cbl_refer_t remainder = cbl_refer_t(NULL));
+               struct cbl_refer_t remainder = cbl_refer_t());
 
 void
 parser_exponentiation(  cbl_refer_t cref,
diff --git a/gcc/cobol/parse.y b/gcc/cobol/parse.y
index c67e5a024c589a4656b9758c14d9efbd0b3d2d2d..0a941575ff94bf29eea67dac8015cabb2edb4bb9 100644
--- a/gcc/cobol/parse.y
+++ b/gcc/cobol/parse.y
@@ -2836,6 +2836,31 @@ data_descr1:    level_name
                   }
 		}
 
+        |       LEVEL88 NAME /* VALUE */ NULLPTR 
+                {
+                  struct cbl_field_t field = { 0,
+                    FldClass, FldInvalid, 0, 0, 0, 88, nonarray, yylineno, "",
+                    0, { 0,0,0,0, NULL, NULL, { NULL }, { NULL } }, NULL };
+                  if( !namcpy(field.name, $2) ) YYERROR;
+
+		  auto fig = constant_of(constant_index(NULLS));
+                  struct cbl_domain_t *domain = new cbl_domain_t[2];
+
+		  domain[0] = fig;
+
+                  field.data.domain = domain;
+
+                  if( ($$ = field_add(&field)) == NULL ) {
+                    yyerror("failed level 88");
+                    YYERROR;
+                  }
+		  auto parent = cbl_field_of(symbol_at($$->parent));
+		  if( parent->type != FldPointer ) {
+		    yyerrorv("error: LEVEL 88 %s VALUE NULLS invalid for "
+			     "%02d %s, which is not a POINTER",
+			     $$->name, parent->level, parent->name);
+		  }
+                }
         |       LEVEL88 NAME VALUE domains
                 {
                   struct cbl_field_t field = { 0,
@@ -3010,10 +3035,12 @@ data_descr1:    level_name
 #endif
                   // SIGN clause valid only with "S" in picture
                   if( $field->type == FldNumericDisplay && !is_signable($field) ) {
-                    static const uint32_t sign_attrs = leading_e | separate_e;
+                    static const size_t sign_attrs = leading_e | separate_e;
+		    static_assert(sizeof(sign_attrs) == sizeof($field->attr),
+		                  "size matters");
 
                     // remove inapplicable inherited sign attributes
-                    uint32_t group_sign = group_attr($field) & sign_attrs;
+                    size_t group_sign = group_attr($field) & sign_attrs;
                     $field->attr &= ~group_sign;
 
                     if( $field->attr & sign_attrs ) {
@@ -3458,7 +3485,7 @@ alphanum_pic:   alphanum_part {
         |       alphanum_pic alphanum_part
                 {
                   if( $2.attr != all_alpha_e ) {
-                    current_field()->attr &= ~all_alpha_e;
+		    current_field()->attr &= ~size_t(all_alpha_e);
                   }
                   $$ += $2.nbyte;
                 }
@@ -3807,7 +3834,7 @@ sign_clause:    sign_is sign_leading sign_separate
                   if( $sign_leading ) {
                     field->attr |= leading_e;
                   } else {
-                    field->attr &= ~leading_e; // turn off in case inherited
+		    field->attr &= ~size_t(leading_e); // turn off in case inherited
                     field->attr |= signable_e;
                   }
                   if( $sign_separate ) field->attr |= separate_e;
@@ -6984,6 +7011,11 @@ set_tgts:       set_tgt {
                 ;
 set_operand:    set_tgt
         |       signed_literal { $$ = new_reference($1); }
+        |       ADDRESS of PROGRAM_kw namestr
+		{
+		  auto label = symbol_program(0, $namestr.data);
+		  $$ = new cbl_refer_t( label );
+		}
                 ;
 set_tgt:        scalar
         |       ADDRESS of scalar { $$ = $scalar; $$->addr_of = true; }
@@ -6994,6 +7026,13 @@ set:            SET set_tgts[tgts] TO set_operand[src]
                   statement_begin(@1, SET);
 
                   switch( set_operand_type(*$src) ) {
+                  case FldInvalid:
+		    if( ! ($src->prog_func && $src->addr_of) ) {
+		      yyerrorv("SET source operand '%s' is invalid", $src->name());
+                      YYERROR;
+                      break;
+		    }
+		    __attribute__((fallthrough));
                   case FldPointer:
                     if( !valid_set_targets(*$tgts, true) ) {
                       YYERROR;
@@ -7001,11 +7040,6 @@ set:            SET set_tgts[tgts] TO set_operand[src]
                     ast_set_pointers($tgts->targets, *$src);
                     break;
 
-                  case FldInvalid:
-		    yyerrorv("SET source operand '%s' is invalid", $src->name());
-                    YYERROR;
-                    break;
-
                   case FldIndex:
                   case FldNumericDisplay:
                   case FldNumericBinary:
diff --git a/gcc/cobol/parse_ante.h b/gcc/cobol/parse_ante.h
index f0652c07b48d166053b9899d5435575e33a1db1a..c063508d7cc63dc50b8f30778a28bb7fbbb02d4a 100644
--- a/gcc/cobol/parse_ante.h
+++ b/gcc/cobol/parse_ante.h
@@ -1126,7 +1126,7 @@ struct unstring_tgt_t {
   }
 private:
   static cbl_refer_t maybe_empty( cbl_refer_t *p ) {
-    return p? *p : cbl_refer_t(NULL);
+    return p? *p : cbl_refer_t();
   }
 };
 
@@ -2653,11 +2653,15 @@ parser_move_carefully( const char */*F*/, int /*L*/,
 static void
 ast_set_pointers( const list<cbl_num_result_t>& tgts, cbl_refer_t src ) {
   assert(!tgts.empty());
-  assert(src.field);
+  assert(src.field || src.prog_func);
   size_t nptr = tgts.size();
   cbl_refer_t ptrs[nptr];
 
   std::transform( tgts.begin(), tgts.end(), ptrs, cbl_num_result_t::refer_of );
+  if( src.prog_func ) {
+    yywarnv("%s: RJD: source ('%s') is program pointer, not data",
+            __func__, src.prog_func->name);
+  }
   parser_set_pointers(nptr, ptrs, src);
 }
 
diff --git a/gcc/cobol/scan.l b/gcc/cobol/scan.l
index a84b366a7f5e09ef605918132fbe96133730b4eb..79eba81bf19a581ccf28f3e90600f3ed41a072ba 100644
--- a/gcc/cobol/scan.l
+++ b/gcc/cobol/scan.l
@@ -1054,6 +1054,7 @@ USE({SPC}FOR)?		{ return USE; }
   TO			{ return TO; }
   TRAILING		{ return TRAILING; }
   TRUE			{ return TRUE_kw; }
+  TYPE			{ return TYPE; }
   TYPEDEF		{ return TYPEDEF; }
   VARYING		{ return VARYING; }
   VOLATILE    		{ return VOLATILE; }
diff --git a/gcc/cobol/symbols.h b/gcc/cobol/symbols.h
index 2acb546b0c8bb7a4292f6afec7d040ca017e1aaf..293e66f748972c9092531790ff24af6f7be5e48f 100644
--- a/gcc/cobol/symbols.h
+++ b/gcc/cobol/symbols.h
@@ -570,6 +570,7 @@ struct cbl_field_t {
     type  = that.type;
     attr |= (that.attr & external_e);
     attr |= same_as_e;
+    occurs = that.occurs; // might be partly wrong
     data  = that.data;
     if( ! (is_typedef || that.type == FldClass) ) {
       data.initial = NULL;
@@ -845,6 +846,7 @@ cbl_file_mode_str( cbl_file_mode_t mode ) {
 
 struct cbl_refer_t {
   cbl_field_t *field;
+  cbl_label_t *prog_func;
   bool all, addr_of;
   uint32_t nsubscript;
   cbl_refer_t *subscripts;  // indices
@@ -852,25 +854,34 @@ struct cbl_refer_t {
   tree refer_decl_node;     // For the cblc_refer_t structure
 
   cbl_refer_t( cbl_field_t *field = NULL, bool all = false )
-    : field(field), all(all), addr_of(false)
+    : field(field), prog_func(NULL)
+    , all(all), addr_of(false)
     , nsubscript(0), subscripts(NULL), refmod(NULL)
     , refer_decl_node(NULL)
   {}
   cbl_refer_t( cbl_field_t *field, cbl_span_t& refmod )
-    : field(field), all(false), addr_of(false)
+    : field(field), prog_func(NULL)
+    , all(false), addr_of(false)
     , nsubscript(0), subscripts(NULL), refmod(refmod)
     , refer_decl_node(NULL)
   {}
   cbl_refer_t( cbl_field_t *field,
                size_t nsubscript, cbl_refer_t *subscripts,
                cbl_span_t refmod = cbl_span_t(NULL) )
-    : field(field), all(false), addr_of(false)
+    : field(field), prog_func(NULL)
+    , all(false), addr_of(false)
     , nsubscript(nsubscript) , subscripts( new cbl_refer_t[nsubscript] )
     , refmod(refmod)
     , refer_decl_node(NULL)
   {
     std::copy(subscripts, subscripts + nsubscript, this->subscripts);
   }
+  explicit cbl_refer_t( cbl_label_t *prog_func, bool addr_of = true )
+    : field(NULL), prog_func(prog_func)
+    , all(false), addr_of(addr_of)
+    , nsubscript(0), subscripts(NULL), refmod(cbl_span_t(NULL))
+    , refer_decl_node(NULL)
+  {}
 
   static cbl_refer_t *empty();
 
diff --git a/gcc/cobol/util.cc b/gcc/cobol/util.cc
index 733a71efec121cf96eab257258169d5bc2c20b50..7c2e63b3e375dbc92d7962f08afdb98423ae6a59 100644
--- a/gcc/cobol/util.cc
+++ b/gcc/cobol/util.cc
@@ -579,7 +579,7 @@ symbol_field_index_set( cbl_field_t *field ) {
   field->data = data;
 
   field->type = FldIndex;
-  field->attr &= ~signable_e;
+  field->attr &= ~size_t(signable_e);
 
   return field;
 }
@@ -600,7 +600,7 @@ symbol_field_type_update( cbl_field_t *field,
         static const cbl_field_data_t data = {0, 8, 0, 0,
                                               NULL, NULL, {NULL}, {NULL}};
         field->data = data;
-        field->attr &= ~ signable_e;
+        field->attr &= ~size_t(signable_e);
       }
       return true;
     default:
@@ -964,6 +964,7 @@ cbl_refer_t::str() const {
 const char *
 cbl_refer_t::name() const {
   char *output;
+  if( prog_func ) return prog_func->name;
   asprintf( &output, "%s", field? field->name : "(none)" );
   return output;
 }