aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2019-08-06 21:32:09 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2019-08-06 21:32:09 +0000
commite0af8f52b10385d859d60a4ee6b89d274e4044bb (patch)
tree738a20ebf9f668b479b13bf5bb6d736c7435316c /gcc
parent1a3920654f92b83a206d62f4eddcf1f5c28a91de (diff)
downloadgcc-e0af8f52b10385d859d60a4ee6b89d274e4044bb.zip
gcc-e0af8f52b10385d859d60a4ee6b89d274e4044bb.tar.gz
gcc-e0af8f52b10385d859d60a4ee6b89d274e4044bb.tar.bz2
re PR fortran/91359 (logical function X returns .TRUE. - Warning: spaghetti code)
2019-08-06 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-06 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/91359 * gfortran.dg/pr91359_1.f: New test. * gfortran.dg/pr91359_2.f: Ditto. From-SVN: r274149
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-decl.c14
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gfortran.dg/pr91359_1.f16
-rw-r--r--gcc/testsuite/gfortran.dg/pr91359_2.f16
5 files changed, 58 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index b88437a..1a2129d 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,11 @@
2019-08-06 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-06 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 96f0e1e..86c3d3a 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -6449,6 +6449,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 af5349a..cb8040c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,11 @@
2019-08-06 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-06 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 0000000..2b8a35a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr91359_1.f
@@ -0,0 +1,16 @@
+! { 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 1
+ end
diff --git a/gcc/testsuite/gfortran.dg/pr91359_2.f b/gcc/testsuite/gfortran.dg/pr91359_2.f
new file mode 100644
index 0000000..2b8a35a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr91359_2.f
@@ -0,0 +1,16 @@
+! { 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 1
+ end