summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Kargl <kargl@gcc.gnu.org>2022-07-15 22:07:15 +0200
committerHarald Anlauf <anlauf@gmx.de>2022-07-16 20:19:12 +0200
commitc1b0037bcc26019a87935e5634b6d448e9773193 (patch)
treeeb9799ebda23beb7fe8f6cc27178233dff19c45b
parent5b877e0f6881a3a4dbbd15e9d2849a460bfe171c (diff)
Fortran: do not generate conflicting results under -ff2c [PR104313]
gcc/fortran/ChangeLog: PR fortran/104313 * trans-decl.cc (gfc_generate_return): Do not generate conflicting fake results for functions with no result variable under -ff2c. gcc/testsuite/ChangeLog: PR fortran/104313 * gfortran.dg/pr104313.f: New test. (cherry picked from commit 517fb1a78102df43f052c6934c27dd51d786aff7)
-rw-r--r--gcc/fortran/trans-decl.cc2
-rw-r--r--gcc/testsuite/gfortran.dg/pr104313.f11
2 files changed, 12 insertions, 1 deletions
diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
index 6493cc2f6b1..908a4c6d42e 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -6474,7 +6474,7 @@ gfc_generate_return (void)
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)
+ if (sym == sym->result && sym->attr.function && !flag_f2c)
{
result = gfc_get_fake_result_decl (sym, 0);
result = fold_build2_loc (input_location, MODIFY_EXPR,
diff --git a/gcc/testsuite/gfortran.dg/pr104313.f b/gcc/testsuite/gfortran.dg/pr104313.f
new file mode 100644
index 00000000000..89c8947cb0a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr104313.f
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! { dg-additional-options "-ff2c -fdump-tree-original" }
+!
+! PR fortran/104313 - ICE verify_gimple failed with -ff2c
+! Contributed by G.Steinmetz
+
+ function f(a)
+ return
+ end
+
+! { dg-final { scan-tree-dump-times "return" 1 "original" } }