diff options
author | kargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2019-08-12 20:09:00 +0000 |
---|---|---|
committer | kargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2019-08-12 20:09:00 +0000 |
commit | cffb2c3f73e4b1d49b3b9d9ea6487b1b8831d17e (patch) | |
tree | 3155fa57e4f135335cbd66aeafea5ce1c5b75aec | |
parent | 16be4d21fcb8c6bfed45c8977a00e82f4b190816 (diff) |
2019-08-12 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/91359
* trans-decl.c (gfc_generate_return): Ensure something is returned
from a function.
2019-08-12 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/91359
* gfortran.dg/pr91359_1.f: New test.
* gfortran.dg/pr91359_2.f: Ditto.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-9-branch@274319 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/trans-decl.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr91359_1.f | 17 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr91359_2.f | 17 |
5 files changed, 60 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 4d07f7778cd..ef90ba0ce7b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,11 @@ 2019-08-12 Steven G. Kargl <kargl@gcc.gnu.org> + PR fortran/91359 + * trans-decl.c (gfc_generate_return): Ensure something is returned + from a function. + +2019-08-12 Steven G. Kargl <kargl@gcc.gnu.org> + PR fortran/42546 * check.c(gfc_check_allocated): Add comment pointing to ... * intrinsic.c(sort_actual): ... the checking done here. diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 9538dee5733..5d1d1ecb19c 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 ee3626bb5a8..8f4b121346c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2019-08-12 Steven G. Kargl <kargl@gcc.gnu.org> + PR fortran/91359 + * gfortran.dg/pr91359_1.f: New test. + * gfortran.dg/pr91359_2.f: Ditto. + +2019-08-12 Steven G. Kargl <kargl@gcc.gnu.org> + PR fortran/42546 * gfortran.dg/allocated_1.f90: New test. * gfortran.dg/allocated_2.f90: Ditto. diff --git a/gcc/testsuite/gfortran.dg/pr91359_1.f b/gcc/testsuite/gfortran.dg/pr91359_1.f new file mode 100644 index 00000000000..82423142e98 --- /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 <briantcarcich at gmail dot com> +! + 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 00000000000..7b81a3092b5 --- /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 <briantcarcich at gmail dot com> +! + 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 |