aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2013-04-03 09:31:23 +0200
committerJanus Weil <janus@gcc.gnu.org>2013-04-03 09:31:23 +0200
commit9362a03b8760f7ea986af5b0b22a5b80bed9d05d (patch)
treed3cc478f4d5200ef178ed16cff43e7f30cf49991
parente0f0935b9dbe8028ba426c6b1051dff96d043f2e (diff)
downloadgcc-9362a03b8760f7ea986af5b0b22a5b80bed9d05d.zip
gcc-9362a03b8760f7ea986af5b0b22a5b80bed9d05d.tar.gz
gcc-9362a03b8760f7ea986af5b0b22a5b80bed9d05d.tar.bz2
re PR fortran/56284 ([OOP] ICE with alternate return in type-bound procedure)
2013-04-03 Janus Weil <janus@gcc.gnu.org> PR fortran/56284 PR fortran/40881 * decl.c (gfc_match_formal_arglist): Warn about alternate-return arguments. * interface.c (check_dummy_characteristics): Return if symbols are NULL. 2013-04-03 Janus Weil <janus@gcc.gnu.org> PR fortran/56284 PR fortran/40881 * gfortran.dg/altreturn_8.f90: New. * gfortran.dg/altreturn_2.f90: Add -std=legacy. * gfortran.dg/intrinsic_actual_3.f90: Ditto. * gfortran.dg/invalid_interface_assignment.f90: Ditto. From-SVN: r197389
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/decl.c10
-rw-r--r--gcc/fortran/interface.c3
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/gfortran.dg/altreturn_2.f902
-rw-r--r--gcc/testsuite/gfortran.dg/altreturn_8.f9023
-rw-r--r--gcc/testsuite/gfortran.dg/intrinsic_actual_3.f902
-rw-r--r--gcc/testsuite/gfortran.dg/invalid_interface_assignment.f902
8 files changed, 58 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 7f9a1a5..bf2a244 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,11 @@
+2013-04-03 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/56284
+ PR fortran/40881
+ * decl.c (gfc_match_formal_arglist): Warn about alternate-return
+ arguments.
+ * interface.c (check_dummy_characteristics): Return if symbols are NULL.
+
2013-04-01 Janus Weil <janus@gcc.gnu.org>
PR fortran/56500
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 72c511c..3188eae 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -4487,7 +4487,15 @@ gfc_match_formal_arglist (gfc_symbol *progname, int st_flag, int null_flag)
for (;;)
{
if (gfc_match_char ('*') == MATCH_YES)
- sym = NULL;
+ {
+ sym = NULL;
+ if (gfc_notify_std (GFC_STD_F95_OBS, "Alternate-return argument "
+ "at %C") == FAILURE)
+ {
+ m = MATCH_ERROR;
+ goto cleanup;
+ }
+ }
else
{
m = gfc_match_name (name);
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index fff8c39..5741911 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -1023,6 +1023,9 @@ static gfc_try
check_dummy_characteristics (gfc_symbol *s1, gfc_symbol *s2,
bool type_must_agree, char *errmsg, int err_len)
{
+ if (s1 == NULL || s2 == NULL)
+ return s1 == s2 ? SUCCESS : FAILURE;
+
/* Check type and rank. */
if (type_must_agree && !compare_type_rank (s2, s1))
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6f120f2..e025a24 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2013-04-03 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/56284
+ PR fortran/40881
+ * gfortran.dg/altreturn_8.f90: New.
+ * gfortran.dg/altreturn_2.f90: Add -std=legacy.
+ * gfortran.dg/intrinsic_actual_3.f90: Ditto.
+ * gfortran.dg/invalid_interface_assignment.f90: Ditto.
+
2013-04-02 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/56745
diff --git a/gcc/testsuite/gfortran.dg/altreturn_2.f90 b/gcc/testsuite/gfortran.dg/altreturn_2.f90
index d0556d0..9abf350 100644
--- a/gcc/testsuite/gfortran.dg/altreturn_2.f90
+++ b/gcc/testsuite/gfortran.dg/altreturn_2.f90
@@ -1,4 +1,6 @@
! { dg-do compile }
+! { dg-options "-std=gnu" }
+
program altreturn_2
call foo() ! { dg-error "Missing alternate return" }
contains
diff --git a/gcc/testsuite/gfortran.dg/altreturn_8.f90 b/gcc/testsuite/gfortran.dg/altreturn_8.f90
new file mode 100644
index 0000000..ccd58a2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/altreturn_8.f90
@@ -0,0 +1,23 @@
+! { dg-do compile }
+! { dg-options "-std=gnu" }
+!
+! PR 56284: [OOP] ICE with alternate return in type-bound procedure
+!
+! Contributed by Arjen Markus <arjen.markus@deltares.nl>
+
+module try_this
+ implicit none
+
+ type :: table_t
+ contains
+ procedure, nopass :: getRecord
+ end type
+
+contains
+
+ subroutine getRecord ( * )
+ end subroutine
+
+end module
+
+! { dg-final { cleanup-modules "try_this" } }
diff --git a/gcc/testsuite/gfortran.dg/intrinsic_actual_3.f90 b/gcc/testsuite/gfortran.dg/intrinsic_actual_3.f90
index c2dd07c..4c159bd 100644
--- a/gcc/testsuite/gfortran.dg/intrinsic_actual_3.f90
+++ b/gcc/testsuite/gfortran.dg/intrinsic_actual_3.f90
@@ -1,4 +1,6 @@
! { dg-do compile }
+! { dg-options "-std=gnu" }
+!
! Tests the fix for PR30237 in which alternate returns in intrinsic
! actual arglists were quietly ignored.
!
diff --git a/gcc/testsuite/gfortran.dg/invalid_interface_assignment.f90 b/gcc/testsuite/gfortran.dg/invalid_interface_assignment.f90
index f3c6e12..4fd7476 100644
--- a/gcc/testsuite/gfortran.dg/invalid_interface_assignment.f90
+++ b/gcc/testsuite/gfortran.dg/invalid_interface_assignment.f90
@@ -1,4 +1,6 @@
! { dg-do compile }
+! { dg-options "-std=gnu" }
+!
! Tests the fix for PR25102, which did not diagnose the aberrant interface
! assignement below.
!