aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2007-04-05 14:06:15 +0000
committerPaul Thomas <pault@gcc.gnu.org>2007-04-05 14:06:15 +0000
commit276ca25d7b89e90c6fda272f1aabc9da01d7342d (patch)
tree83e273fbd1bb9b23ba711ad472cf3a55032e49e3
parent060fca4a44e24baebe7575b9119518b7821c1c45 (diff)
downloadgcc-276ca25d7b89e90c6fda272f1aabc9da01d7342d.zip
gcc-276ca25d7b89e90c6fda272f1aabc9da01d7342d.tar.gz
gcc-276ca25d7b89e90c6fda272f1aabc9da01d7342d.tar.bz2
re PR fortran/31483 ([4.1/4.2 only] ICE on fortran Code)
2007-04-05 Paul Thomas <pault@gcc.gnu.org> PR fortran/31483 * trans-expr.c (gfc_conv_function_call): Give a dummy procedure the correct type if it has alternate returns. 2007-04-05 Paul Thomas <pault@gcc.gnu.org> PR fortran/31483 * gfortran.dg/altreturn_5.f90: New test. From-SVN: r123518
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-expr.c18
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/altreturn_5.f9031
4 files changed, 54 insertions, 6 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 6e1be68..5b3001f 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,11 @@
2007-04-05 Paul Thomas <pault@gcc.gnu.org>
+ PR fortran/31483
+ * trans-expr.c (gfc_conv_function_call): Give a dummy
+ procedure the correct type if it has alternate returns.
+
+2007-04-05 Paul Thomas <pault@gcc.gnu.org>
+
PR fortran/31292
* decl.c (gfc_match_modproc): Go up to the top of the namespace
tree to find the module namespace for gfc_get_symbol.
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 036d55b..5ff0c44 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -2392,17 +2392,23 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
/* Generate the actual call. */
gfc_conv_function_val (se, sym);
+
/* If there are alternate return labels, function type should be
integer. Can't modify the type in place though, since it can be shared
- with other functions. */
+ with other functions. For dummy arguments, the typing is done to
+ to this result, even if it has to be repeated for each call. */
if (has_alternate_specifier
&& TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) != integer_type_node)
{
- gcc_assert (! sym->attr.dummy);
- TREE_TYPE (sym->backend_decl)
- = build_function_type (integer_type_node,
- TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
- se->expr = build_fold_addr_expr (sym->backend_decl);
+ if (!sym->attr.dummy)
+ {
+ TREE_TYPE (sym->backend_decl)
+ = build_function_type (integer_type_node,
+ TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
+ se->expr = build_fold_addr_expr (sym->backend_decl);
+ }
+ else
+ TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) = integer_type_node;
}
fntype = TREE_TYPE (TREE_TYPE (se->expr));
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c3fccfa..28316c2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2007-04-05 Paul Thomas <pault@gcc.gnu.org>
+ PR fortran/31483
+ * gfortran.dg/altreturn_5.f90: New test.
+
+2007-04-05 Paul Thomas <pault@gcc.gnu.org>
+
PR fortran/31292
* gfortran.dg/contained_module_proc_1.f90: New test.
diff --git a/gcc/testsuite/gfortran.dg/altreturn_5.f90 b/gcc/testsuite/gfortran.dg/altreturn_5.f90
new file mode 100644
index 0000000..ff1b822
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/altreturn_5.f90
@@ -0,0 +1,31 @@
+! { dg-do run }
+! Tests the fix for PR31483, in which dummy argument procedures
+! produced an ICE if they had an alternate return.
+!
+! Contributed by Mathias Fröhlich <M.Froehlich@science-computing.de>
+
+ SUBROUTINE R (i, *, *)
+ INTEGER i
+ RETURN i
+ END
+
+ SUBROUTINE PHLOAD (READER, i, res)
+ IMPLICIT NONE
+ EXTERNAL READER
+ integer i
+ character(3) res
+ CALL READER (i, *1, *2)
+ 1 res = "one"
+ return
+ 2 res = "two"
+ return
+ END
+
+ EXTERNAL R
+ character(3) res
+ call PHLOAD (R, 1, res)
+ if (res .ne. "one") call abort ()
+ CALL PHLOAD (R, 2, res)
+ if (res .ne. "two") call abort ()
+ END
+