diff --git a/gcc/cobol/UAT/failsuite.src/run_functions.at b/gcc/cobol/UAT/failsuite.src/run_functions.at
index 154b0b83207abc4ecf89d94b4dbd3f7b222e4815..8fb2a5dcb106430058548a2a97e9249d4c0a478e 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 452d29d490a94b10907dd1958cfdbb4289c5f5f0..3eaa25a32e4809298bf29e375068079b92f163ca 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 1fde026899f3b519ed78fa23aa37cf043d2cfc9d..8d7bd1ddd649d8273a0f8369bbd68fb62723e85b 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 867a619575903f0ebe8a9cd6d9ca1b055b4b2b6e..1cc4b3f1da85bc1a89370c5497d745c1e13c2148 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 4bf0586dccf3c18d540d3f09a57cc9a1a87625af..c44e9df16c5f7796978492a91c29172149afd642 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();