From: Janus Weil Date: Wed, 3 Apr 2013 07:31:23 +0000 (+0200) Subject: re PR fortran/56284 ([OOP] ICE with alternate return in type-bound procedure) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9362a03b8760f7ea986af5b0b22a5b80bed9d05d;p=gcc.git re PR fortran/56284 ([OOP] ICE with alternate return in type-bound procedure) 2013-04-03 Janus Weil 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 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 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 7f9a1a5ccb3..bf2a244dee7 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2013-04-03 Janus Weil + + 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 PR fortran/56500 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 72c511c8b24..3188eaeafc6 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 fff8c39ad93..5741911f0ae 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 6f120f28c0b..e025a242f66 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2013-04-03 Janus Weil + + 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 PR rtl-optimization/56745 diff --git a/gcc/testsuite/gfortran.dg/altreturn_2.f90 b/gcc/testsuite/gfortran.dg/altreturn_2.f90 index d0556d0370d..9abf3501fb1 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 00000000000..ccd58a2b083 --- /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 + +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 c2dd07cda5a..4c159bde179 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 f3c6e1269b2..4fd747616a4 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. !