From: Steven G. Kargl Date: Mon, 12 Aug 2019 20:09:00 +0000 (+0000) Subject: re PR fortran/91359 (logical function X returns .TRUE. - Warning: spaghetti code) X-Git-Tag: releases/gcc-9.3.0~741 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a77715d9406f6d4e5681f9407d7d0b1dcce3b8ed;p=thirdparty%2Fgcc.git re PR fortran/91359 (logical function X returns .TRUE. - Warning: spaghetti code) 2019-08-12 Steven G. Kargl PR fortran/91359 * trans-decl.c (gfc_generate_return): Ensure something is returned from a function. 2019-08-12 Steven G. Kargl PR fortran/91359 * gfortran.dg/pr91359_1.f: New test. * gfortran.dg/pr91359_2.f: Ditto. From-SVN: r274319 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 4d07f7778cd4..ef90ba0ce7bd 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2019-08-12 Steven G. Kargl + + PR fortran/91359 + * trans-decl.c (gfc_generate_return): Ensure something is returned + from a function. + 2019-08-12 Steven G. Kargl PR fortran/42546 diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 9538dee5733a..5d1d1ecb19c8 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -6440,6 +6440,20 @@ gfc_generate_return (void) TREE_TYPE (result), DECL_RESULT (fndecl), result); } + else + { + /* If the function does not have a result variable, result is + NULL_TREE, and a 'return' is generated without a variable. + The following generates a 'return __result_XXX' where XXX is + the function name. */ + if (sym == sym->result && sym->attr.function) + { + result = gfc_get_fake_result_decl (sym, 0); + result = fold_build2_loc (input_location, MODIFY_EXPR, + TREE_TYPE (result), + DECL_RESULT (fndecl), result); + } + } } return build1_v (RETURN_EXPR, result); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ee3626bb5a8f..8f4b121346ca 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-08-12 Steven G. Kargl + + PR fortran/91359 + * gfortran.dg/pr91359_1.f: New test. + * gfortran.dg/pr91359_2.f: Ditto. + 2019-08-12 Steven G. Kargl PR fortran/42546 diff --git a/gcc/testsuite/gfortran.dg/pr91359_1.f b/gcc/testsuite/gfortran.dg/pr91359_1.f new file mode 100644 index 000000000000..82423142e981 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr91359_1.f @@ -0,0 +1,17 @@ +! { dg-do run } +! PR fortran/91359 +! Orginal code contributed by Brian T. Carcich +! + logical function zero() + goto 2 +1 return +2 zero = .false. + if (.not.zero) goto 1 + return + end + + program test_zero + logical zero + if (zero()) stop 'FAIL: zero() returned .TRUE.' + stop 'OKAY: zero() returned .FALSE.' + end diff --git a/gcc/testsuite/gfortran.dg/pr91359_2.f b/gcc/testsuite/gfortran.dg/pr91359_2.f new file mode 100644 index 000000000000..7b81a3092b54 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr91359_2.f @@ -0,0 +1,17 @@ +! { dg-do run } +! PR fortran/91359 +! Orginal code contributed by Brian T. Carcich +! + logical function zero() result(a) + goto 2 +1 return +2 a = .false. + if (.not.a) goto 1 + return + end + + program test_zero + logical zero + if (zero()) stop 'FAIL: zero() returned .TRUE.' + stop 'OKAY: zero() returned .FALSE.' + end