From 70a642b7e0038c5d41183e5797ad1ff86dc287ee Mon Sep 17 00:00:00 2001
From: Bob Dubner <rdubner@symas.com>
Date: Mon, 20 Jan 2025 23:56:07 -0500
Subject: [PATCH] UAT for recursive PERFORM PARAGRAPH

---
 gcc/cobol/UAT/testsuite.src/run_misc.at | 27 +++++++++++++++++++++++++
 gcc/cobol/gengen.cc                     |  3 ++-
 gcc/cobol/parse.y                       |  2 +-
 3 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/gcc/cobol/UAT/testsuite.src/run_misc.at b/gcc/cobol/UAT/testsuite.src/run_misc.at
index 1bba23a794bb..20b47ff0bdea 100644
--- a/gcc/cobol/UAT/testsuite.src/run_misc.at
+++ b/gcc/cobol/UAT/testsuite.src/run_misc.at
@@ -3417,6 +3417,33 @@ AT_CHECK([$COMPILE -o caller caller.cob callee.o callee2.o], [0], [], [])
 AT_CHECK([$COBCRUN_DIRECT ./caller], [0], [OK], [])
 AT_CLEANUP
 
+AT_SETUP([Recursive PERFORM paragraph])
+AT_KEYWORDS([recursive recursion])
+AT_DATA([prog.cob], [        identification      division.
+        program-id.         prog.
+        data                division.
+        working-storage     section.
+        77 n binary-double unsigned.
+        77 f binary-double unsigned.
+        procedure           division.
+        move 20 to n
+        move 1 to f
+        display "compute " n " factorial".
+        fact.
+            compute f = f * n
+            subtract 1 from n
+            if n not equal to zero then 
+                perform fact
+            end-if.
+        end-fact.
+        display f.
+        end program         prog.
+])
+AT_CHECK([$COMPILE -o prog prog.cob], [0], [], [])
+AT_CHECK([./prog], [0], [compute 0000000000000000020 factorial
+2432902008176640000
+], [])
+AT_CLEANUP
 
 AT_SETUP([PERFORM inline (1)])
 AT_KEYWORDS([misc])
diff --git a/gcc/cobol/gengen.cc b/gcc/cobol/gengen.cc
index 381c02aab94d..d92f33786704 100644
--- a/gcc/cobol/gengen.cc
+++ b/gcc/cobol/gengen.cc
@@ -1617,7 +1617,8 @@ static tree
 gg_get_larger_type(tree A, tree B)
   {
   tree larger = TREE_TYPE(B);
-  if( TYPE_SIZE(TREE_TYPE(A)) > TYPE_SIZE(TREE_TYPE(B)) )
+  if(    TREE_INT_CST_LOW(TYPE_SIZE(TREE_TYPE(A))) 
+       > TREE_INT_CST_LOW(TYPE_SIZE(TREE_TYPE(B))) )
     {
     larger = TREE_TYPE(A);
     }
diff --git a/gcc/cobol/parse.y b/gcc/cobol/parse.y
index 4cf4a020d82e..e6ba144a012f 100644
--- a/gcc/cobol/parse.y
+++ b/gcc/cobol/parse.y
@@ -1066,7 +1066,7 @@ function_id:    FUNCTION '.' NAME program_as program_attrs[attr] '.'
                   int main_error = 0;
                   parser_enter_program( $NAME, true, &main_error );
                   if( main_error ) {
-                    error_msg(@NAME, "PROGRAM-ID 'main' is invalid with -main option");
+                    error_msg(@NAME, "FUNCTION-ID 'main' is invalid with -main option");
                     YYERROR;
                   }
                   if( symbols_begin() == symbols_end() ) {
-- 
GitLab