aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2009-07-27 20:26:34 +0200
committerJanus Weil <janus@gcc.gnu.org>2009-07-27 20:26:34 +0200
commite26f55480f2895cfa21613d9250736411e55ae15 (patch)
treef2377284b13d7bf04e368921ef58c67c590aba4e
parentcf157324f383a7bfb6504e8ec20d8d0a569ac43b (diff)
downloadgcc-e26f55480f2895cfa21613d9250736411e55ae15.zip
gcc-e26f55480f2895cfa21613d9250736411e55ae15.tar.gz
gcc-e26f55480f2895cfa21613d9250736411e55ae15.tar.bz2
re PR fortran/40848 (ICE with alternate returns)
2009-07-27 Janus Weil <janus@gcc.gnu.org> PR fortran/40848 * interface.c (gfc_compare_interfaces): Call 'count_types_test' before 'generic_correspondence', and only if checking a generic interface. 2009-07-27 Janus Weil <janus@gcc.gnu.org> PR fortran/40848 * gfortran.dg/altreturn_7.f90: New. From-SVN: r150134
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/interface.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/altreturn_7.f9034
4 files changed, 47 insertions, 7 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 91a45e9..7b6d59e 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2009-07-27 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/40848
+ * interface.c (gfc_compare_interfaces): Call 'count_types_test' before
+ 'generic_correspondence', and only if checking a generic interface.
+
2009-07-27 Tobias Burnus <burnus@net-b.de>
PR fortran/40851
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index cedca45..982aa29 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -983,6 +983,8 @@ gfc_compare_interfaces (gfc_symbol *s1, gfc_symbol *s2, int generic_flag,
if (generic_flag)
{
+ if (count_types_test (f1, f2) || count_types_test (f2, f1))
+ return 0;
if (generic_correspondence (f1, f2) || generic_correspondence (f2, f1))
return 0;
}
@@ -1034,13 +1036,6 @@ gfc_compare_interfaces (gfc_symbol *s1, gfc_symbol *s2, int generic_flag,
f2 = f2->next;
}
- if (count_types_test (f1, f2) || count_types_test (f2, f1))
- {
- if (errmsg != NULL)
- snprintf (errmsg, err_len, "Interface not matching");
- return 0;
- }
-
return 1;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index de42d02..04e5407 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-07-27 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/40848
+ * gfortran.dg/altreturn_7.f90: New.
+
2009-07-27 Simon Baldwin <simonb@google.com>
PR testsuite/40829
diff --git a/gcc/testsuite/gfortran.dg/altreturn_7.f90 b/gcc/testsuite/gfortran.dg/altreturn_7.f90
new file mode 100644
index 0000000..6eb0c78
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/altreturn_7.f90
@@ -0,0 +1,34 @@
+! { dg-do compile }
+!
+! PR 40848: [4.5 Regression] ICE with alternate returns
+!
+! Contributed by Joost VandeVondele <jv244@cam.ac.uk>
+
+MODULE TT
+
+INTERFACE M
+ MODULE PROCEDURE M1,M2
+END INTERFACE
+
+CONTAINS
+
+ SUBROUTINE M1(I,*)
+ INTEGER :: I
+ RETURN 1
+ END SUBROUTINE
+
+ SUBROUTINE M2(I,J)
+ INTEGER :: I,J
+ END SUBROUTINE
+
+END MODULE
+
+
+ USE TT
+ CALL M(1,*2)
+ CALL ABORT()
+2 CONTINUE
+END
+
+! { dg-final { cleanup-modules "tt" } }
+