From 67eb0ab2aa069212fffc08897ad7f47cb3993fd6 Mon Sep 17 00:00:00 2001
From: "James K. Lowden" <jklowden@symas.com>
Date: Wed, 3 Apr 2024 10:35:39 -0400
Subject: [PATCH] WIP: introduce typedef

---
 gcc/cobol/cdf.y        | 18 +++++++++---------
 gcc/cobol/genapi.cc    |  1 -
 gcc/cobol/parse.y      | 21 ++++++++++++++++-----
 gcc/cobol/parse_ante.h |  1 +
 gcc/cobol/scan.l       |  2 ++
 gcc/cobol/symbols.cc   |  1 -
 gcc/cobol/symbols.h    |  2 +-
 7 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/gcc/cobol/cdf.y b/gcc/cobol/cdf.y
index 6e53f1b64907..d38f3fb6703a 100644
--- a/gcc/cobol/cdf.y
+++ b/gcc/cobol/cdf.y
@@ -249,7 +249,7 @@ apply_cdf_turn( exception_turns_t& turns ) {
 %type	<cdfarg>	namelit name_any name_one
 %type	<string>	name subscript subscripts inof
 %token	<boolean>	BOOL
-%token	<number>	FEATURE 361 NUMBER EXCEPTION_NAME 279 
+%token	<number>	FEATURE 361  NUMBER 302 EXCEPTION_NAME 279 
 
 %type	<cdfval>	cdf_expr
 %type	<cdfval>	cdf_relexpr cdf_reloper cdf_and cdf_bool_expr
@@ -280,18 +280,18 @@ apply_cdf_turn( exception_turns_t& turns ) {
 %token AS 451  CONSTANT 357  DEFINED 359 
 %type	<boolean>	     DEFINED
 %token OTHER 671  PARAMETER_kw 364  OFF 660  OVERRIDE 365 
-%token THRU 908 
-%token TRUE_kw 782 
+%token THRU 909 
+%token TRUE_kw 783 
 
-%token TURN 784  CHECKING 475  LOCATION 623  ON 662  WITH 809 
+%token TURN 785  CHECKING 475  LOCATION 623  ON 662  WITH 811 
 
-%left OR 909 
-%left AND 910 
-%right NOT 911 
-%left '<'  '>'  '='  NE 912  LE 913  GE 914 
+%left OR 910 
+%left AND 911 
+%right NOT 912 
+%left '<'  '>'  '='  NE 913  LE 914  GE 915 
 %left '-'  '+' 
 %left '*'  '/' 
-%right NEG 915 
+%right NEG 916 
 
 %define api.prefix {ydf}
 %define api.token.prefix{YDF_}
diff --git a/gcc/cobol/genapi.cc b/gcc/cobol/genapi.cc
index bec4ad4fb803..a549db5cd8c0 100644
--- a/gcc/cobol/genapi.cc
+++ b/gcc/cobol/genapi.cc
@@ -14756,7 +14756,6 @@ parser_symbol_add(struct cbl_field_t *new_var )
     if( new_var->type == FldClass && new_var->level != 88 )
       {
       new_var->data.initial = get_class_condition_string(new_var);
-      //// new_var->attr |= class_is_string_e; not used? 
       }
 
     if( new_var->type == FldLiteralA )
diff --git a/gcc/cobol/parse.y b/gcc/cobol/parse.y
index 1cbeba64eb60..848dbc9ab899 100644
--- a/gcc/cobol/parse.y
+++ b/gcc/cobol/parse.y
@@ -721,7 +721,7 @@
                         SEPARATE SEQUENCE SEQUENTIAL SHARING
 			SIGN SIN SIZE SIZE_ERROR SOURCE SOURCE_COMPUTER
                         SPACES SPECIAL_NAMES SQRT STANDARD STANDARD_ALPHABET
-                        STANDARD_1 STANDARD_DEVIATION STATUS
+                        STANDARD_1 STANDARD_DEVIATION STATUS STRONG
 			STDERR STDIN STDOUT
 			LITERAL SUBSTITUTE SUM SWITCH SYMBOL SYMBOLIC SYNCHRONIZED
                         SYSIN SYSIPT SYSLST SYSOUT SYSPCH SYSPUNCH
@@ -730,7 +730,7 @@
                         TEST_DAY_YYYYDDD TEST_FORMATTED_DATETIME TEST_NUMVAL
                         TEST_NUMVAL_C TEST_NUMVAL_F THAN TIME TIMES TO TOP
                         TRACKS TRACK_AREA TRAILING TRANSFORM TRIM TRUE_kw TRY
-                        TURN TYPE
+                        TURN TYPE TYPEDEF
 
                         ULENGTH UNBOUNDED UNIT UNITS UNIT_RECORD UNTIL UP UPON
                         UPOS UPPER_CASE UPSI USAGE USING USUBSTR USUPPLEMENTARY
@@ -759,7 +759,7 @@
 			PREFIXED PREVIOUS PROHIBITED RELATION REQUIRED
 			REVERSE_VIDEO ROUNDING
 			SECONDS SECURE SHORT SIGNED STANDARD_BINARY
-			STANDARD_DECIMAL STATEMENT STEP STRONG STRUCTURE
+			STANDARD_DECIMAL STATEMENT STEP STRUCTURE
 			TOWARD_GREATER TOWARD_LESSER TRUNCATION
 			UCS_4 UNDERLINE UNSIGNED UTF_16 UTF_8
 
@@ -3299,6 +3299,7 @@ data_clause:    any_length        { $$ = any_length_e; }
         |       same_clause       { $$ = same_clause_e; }
         |       sign_clause       { $$ = sign_clause_e; }
         |       synched_clause    { $$ = synched_clause_e; }
+        |       typedef_clause    { $$ = typedef_clause_e; }
         |       usage_clause      { $$ = usage_clause_e; }
         |       value_clause      { $$ = value_clause_e;
                   cbl_field_t *field = current_field();
@@ -3841,6 +3842,14 @@ sign_separate:  %empty              { $$ = false; }
         |       SEPARATE            { $$ = true; }
                 ;
 
+typedef_clause: is TYPEDEF strong 
+		{
+                  cbl_field_t *field = current_field();
+		  field->attr |= typedef_e;
+		  yywarn("warning: TYPEDEF not implemented");
+		}
+		;
+
 volatile_clause:
 		VOLATILE
 		{
@@ -9360,14 +9369,16 @@ record:         %empty
 sign:           %empty
         |       SIGN
                 ;
-
 status:         %empty
         |       STATUS
                 ;
+strong:          %empty
+        |       STRONG
+                ;
+
 times:          %empty
         |       TIMES
                 ;
-
 then:           %empty
         |       THEN
                 ;
diff --git a/gcc/cobol/parse_ante.h b/gcc/cobol/parse_ante.h
index ae62c9b741e3..f185636d3941 100644
--- a/gcc/cobol/parse_ante.h
+++ b/gcc/cobol/parse_ante.h
@@ -200,6 +200,7 @@ enum data_clause_t {
   based_clause_e       = 0x0800,
   same_clause_e        = 0x1000,
   volatile_clause_e    = 0x2000,
+  typedef_clause_e     = 0x4000,
 };
 
 static inline bool
diff --git a/gcc/cobol/scan.l b/gcc/cobol/scan.l
index d1fd0b9edfca..3cdfd0f75317 100644
--- a/gcc/cobol/scan.l
+++ b/gcc/cobol/scan.l
@@ -1046,12 +1046,14 @@ USE({SPC}FOR)?		{ return USE; }
   SIGN			{ return SIGN; }
   SIZE			{ return SIZE; }
   STANDARD		{ return STANDARD; }
+  STRONG		{ return STRONG; }
   SYNC(HRONIZED)?	{ return SYNCHRONIZED; }
   TIMES			{ return TIMES; }
   TIMES[[:space::]]+DEPENDING		{ return DEPENDING; }
   TO			{ return TO; }
   TRAILING		{ return TRAILING; }
   TRUE			{ return TRUE_kw; }
+  TYPEDEF		{ return TYPEDEF; }
   VARYING		{ return VARYING; }
   VOLATILE    		{ return VOLATILE; }
   WHEN    		{ return WHEN; }
diff --git a/gcc/cobol/symbols.cc b/gcc/cobol/symbols.cc
index 73dd70c93a3a..ee1170a25f5b 100644
--- a/gcc/cobol/symbols.cc
+++ b/gcc/cobol/symbols.cc
@@ -3004,7 +3004,6 @@ temporaries_t::literal( const char value[], uint32_t len, cbl_field_attr_t attr
             __func__, __LINE__,
             field->data.initial, field->attr, attr);
     }
-    assert(field->data.capacity == len);
     return field;
   }
   return literals[key] = new_literal_add(value, len, attr);
diff --git a/gcc/cobol/symbols.h b/gcc/cobol/symbols.h
index cd4dca5a888e..18aada2201eb 100644
--- a/gcc/cobol/symbols.h
+++ b/gcc/cobol/symbols.h
@@ -273,7 +273,6 @@ enum cbl_field_attr_t {
   intermediate_e    = 0x0000001000, // Used for intermediate arithmetic
   anyhow_e          = 0x0000004000, // compares true to anything. (Note the break in the bit pattern)
   otherhow_e        = 0x0000006000, // compares true and returns true
-  class_is_string_DNU = 0x0000008000, // as opposed to numeric
   embiggened_e      = 0x0000008000, // redefined numeric made 64-bit by USAGE POINTER
   thru_fact_e       = 0x0000010000, // logical value was established by THRU
   scaled_e          = 0x0000020000,
@@ -299,6 +298,7 @@ enum cbl_field_attr_t {
   big_endian_e      = 0x1000000000, // Indicates a value is big-endian
   same_as_e         = 0x2000000000, // Field produced by SAME AS (cannot take new members)
   record_key_e      = 0x4000000000,
+  typedef_e         = 0x8000000000, // IS TYPEDEF
 };
 
 // This constant establishes the maximum number of digits in a fixed point
-- 
GitLab