From e575540bb45f3cf9f82e557d6459fa59c998013b Mon Sep 17 00:00:00 2001 From: Janus Weil Date: Sat, 14 Dec 2013 11:31:56 +0100 Subject: [PATCH] re PR fortran/59450 ([OOP] ICE for type-bound-procedure expression in module procedure interface) 2013-12-14 Janus Weil PR fortran/59450 * module.c (mio_expr): Handle type-bound function expressions. 2013-12-14 Janus Weil PR fortran/59450 * gfortran.dg/typebound_proc_31.f90: New. From-SVN: r205983 --- gcc/fortran/ChangeLog | 5 ++++ gcc/fortran/module.c | 33 +++++++++++++++++++------ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gfortran.dg/typebound_proc_31.f90 | 28 +++++++++++++++++++++ 4 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/typebound_proc_31.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9d8f1ba..197b890 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2013-12-14 Janus Weil + + PR fortran/59450 + * module.c (mio_expr): Handle type-bound function expressions. + 2013-12-12 Tobias Burnus PR fortran/59440 diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index 0cd4801..98e22df 100644 --- a/gcc/fortran/module.c +++ b/gcc/fortran/module.c @@ -3358,12 +3358,24 @@ mio_expr (gfc_expr **ep) { e->value.function.name = mio_allocated_string (e->value.function.name); - flag = e->value.function.esym != NULL; - mio_integer (&flag); - if (flag) - mio_symbol_ref (&e->value.function.esym); + if (e->value.function.esym) + flag = 1; + else if (e->ref) + flag = 2; else - write_atom (ATOM_STRING, e->value.function.isym->name); + flag = 0; + mio_integer (&flag); + switch (flag) + { + case 1: + mio_symbol_ref (&e->value.function.esym); + break; + case 2: + mio_ref_list (&e->ref); + break; + default: + write_atom (ATOM_STRING, e->value.function.isym->name); + } } else { @@ -3372,10 +3384,15 @@ mio_expr (gfc_expr **ep) free (atom_string); mio_integer (&flag); - if (flag) - mio_symbol_ref (&e->value.function.esym); - else + switch (flag) { + case 1: + mio_symbol_ref (&e->value.function.esym); + break; + case 2: + mio_ref_list (&e->ref); + break; + default: require_atom (ATOM_STRING); e->value.function.isym = gfc_find_function (atom_string); free (atom_string); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 351bef6..91dcb33 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-12-14 Janus Weil + + PR fortran/59450 + * gfortran.dg/typebound_proc_31.f90: New. + 2013-12-13 Rainer Orth * g++.dg/cilk-plus/cilk-plus.exp: Properly set ld_library_path. diff --git a/gcc/testsuite/gfortran.dg/typebound_proc_31.f90 b/gcc/testsuite/gfortran.dg/typebound_proc_31.f90 new file mode 100644 index 0000000..d83a9cd --- /dev/null +++ b/gcc/testsuite/gfortran.dg/typebound_proc_31.f90 @@ -0,0 +1,28 @@ +! { dg-do compile } +! +! PR 59450: [OOP] ICE for type-bound-procedure expression in module procedure interface +! +! Contributed by + +module classes + + implicit none + + type :: base_class + contains + procedure, nopass :: get_num + end type + +contains + + pure integer function get_num() + end function + + function get_array( this ) result(array) + class(base_class), intent(in) :: this + integer, dimension( this%get_num() ) :: array + end function + +end module + +! { dg-final { cleanup-modules "classes" } } -- 2.7.4