From 0f752f8d8897f2392df243839f791965c349e403 Mon Sep 17 00:00:00 2001
From: "James K. Lowden" <jklowden@symas.com>
Date: Mon, 18 Dec 2023 11:10:47 -0500
Subject: [PATCH] begin adding -preprocess

---
 gcc/cobol/UAT/failsuite.src/run_functions.at | 5 +++++
 gcc/cobol/cobol1.cc                          | 4 ++++
 gcc/cobol/lang-specs.h                       | 1 +
 gcc/cobol/lang.opt                           | 4 ++++
 gcc/cobol/parse.y                            | 6 +++---
 5 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/gcc/cobol/UAT/failsuite.src/run_functions.at b/gcc/cobol/UAT/failsuite.src/run_functions.at
index 154b0b83207a..8fb2a5dcb106 100644
--- a/gcc/cobol/UAT/failsuite.src/run_functions.at
+++ b/gcc/cobol/UAT/failsuite.src/run_functions.at
@@ -2931,6 +2931,8 @@ AT_CLEANUP
 
 AT_SETUP([FUNCTION SUBSTITUTE-CASE])
 AT_KEYWORDS([functions])
+AT_XFAIL_IF([test "$COB_DIALECT" != "gnu"])
+
 AT_DATA([prog.cob], [
        IDENTIFICATION   DIVISION.
        PROGRAM-ID.      prog.
@@ -2955,6 +2957,8 @@ AT_CLEANUP
 
 AT_SETUP([FUNCTION SUBSTITUTE-CASE with reference mod])
 AT_KEYWORDS([functions])
+AT_XFAIL_IF([test "$COB_DIALECT" != "gnu"])
+
 AT_DATA([prog.cob], [
        IDENTIFICATION   DIVISION.
        PROGRAM-ID.      prog.
@@ -3969,6 +3973,7 @@ AT_CLEANUP
 
 AT_SETUP([FORMATTED-(DATE)TIME with SYSTEM-OFFSET])
 AT_KEYWORDS([functions FORMATTED-TIME FORMATTED-DATETIME extensions])
+AT_XFAIL_IF([test "$COB_DIALECT" != "gnu"])
 
 AT_DATA([prog.cob], [
        IDENTIFICATION  DIVISION.
diff --git a/gcc/cobol/cobol1.cc b/gcc/cobol/cobol1.cc
index 452d29d490a9..3eaa25a32e48 100644
--- a/gcc/cobol/cobol1.cc
+++ b/gcc/cobol/cobol1.cc
@@ -251,6 +251,10 @@ cobol_langhook_handle_option (size_t scode,
           }
           return true;
           
+        case OPT_preprocess:
+          ////preprocess_filter_add(arg);
+          return true;
+
         case OPT_main:
             // This isn't right.  All OPT_main should be replaced 
             error("We should never see a non-equal dash-main in cobol1.c");
diff --git a/gcc/cobol/lang-specs.h b/gcc/cobol/lang-specs.h
index 1fde026899f3..8d7bd1ddd649 100644
--- a/gcc/cobol/lang-specs.h
+++ b/gcc/cobol/lang-specs.h
@@ -38,6 +38,7 @@
 	"%{fcobol-exceptions*} "
 	"%{fstatic-call} "
 	"%{ffixed-form} %{ffree-form} "
+	"%{preprocess} "
 	"%{dialect} "
 	"%{!fsyntax-only:%(invoke_as)} "
 	, 0, 0, 0},
diff --git a/gcc/cobol/lang.opt b/gcc/cobol/lang.opt
index 867a61957590..1cc4b3f1da85 100644
--- a/gcc/cobol/lang.opt
+++ b/gcc/cobol/lang.opt
@@ -114,6 +114,10 @@ fyacc-debug
 Cobol Var(yy_debug, 1) Init(0)
 Enable Cobol yacc debugging
 
+preprocess
+Cobol Joined Separate Var(cobol_preprocess)
+preprocess <source_filter> before compiling
+
 main
 Cobol
 -main	Next source_file/PROGRAM-ID is called by main()
diff --git a/gcc/cobol/parse.y b/gcc/cobol/parse.y
index 4bf0586dccf3..c44e9df16c5f 100644
--- a/gcc/cobol/parse.y
+++ b/gcc/cobol/parse.y
@@ -8465,21 +8465,21 @@ intrinsic:      intrinsic0
                   if( ! intrinsic_call_1($$, FORMATTED_CURRENT_DATE, r1) )
                                          YYERROR;
                 }
-        |       TEST_FORMATTED_DATETIME '(' DATE_FMT[r1] num_operand[r2] ')' {
+        |       TEST_FORMATTED_DATETIME '(' DATE_FMT[r1] varg[r2] ')' {
                 location_set(@1);
                   $$ = new_tempnumeric();
                   auto r1 = new_reference(new_literal($r1, quoted_e));
                   if( ! intrinsic_call_2($$, TEST_FORMATTED_DATETIME,
                                               r1, $r2) ) YYERROR;
                 }
-        |       TEST_FORMATTED_DATETIME '(' TIME_FMT[r1] num_operand[r2] ')' {
+        |       TEST_FORMATTED_DATETIME '(' TIME_FMT[r1] varg[r2] ')' {
                 location_set(@1);
                   $$ = new_tempnumeric();
                   auto r1 = new_reference(new_literal($r1, quoted_e));
                   if( ! intrinsic_call_2($$, TEST_FORMATTED_DATETIME,
                                               r1, $r2) ) YYERROR;
                 }
-        |       TEST_FORMATTED_DATETIME '(' DATETIME_FMT[r1] num_operand[r2] ')'
+        |       TEST_FORMATTED_DATETIME '(' DATETIME_FMT[r1] varg[r2] ')'
                 {
                 location_set(@1);
                   $$ = new_tempnumeric();
-- 
GitLab