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