diff options
author | Janus Weil <janus@gcc.gnu.org> | 2013-12-14 11:31:56 +0100 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2013-12-14 11:31:56 +0100 |
commit | e575540bb45f3cf9f82e557d6459fa59c998013b (patch) | |
tree | 681d0f8e6ea9d9be00d9ed90c300f3723c5987dc | |
parent | deb1de6782e139ccbccc6d4e5dc20c8c320eef78 (diff) | |
download | gcc-e575540bb45f3cf9f82e557d6459fa59c998013b.zip gcc-e575540bb45f3cf9f82e557d6459fa59c998013b.tar.gz gcc-e575540bb45f3cf9f82e557d6459fa59c998013b.tar.bz2 |
re PR fortran/59450 ([OOP] ICE for type-bound-procedure expression in module procedure interface)
2013-12-14 Janus Weil <janus@gcc.gnu.org>
PR fortran/59450
* module.c (mio_expr): Handle type-bound function expressions.
2013-12-14 Janus Weil <janus@gcc.gnu.org>
PR fortran/59450
* gfortran.dg/typebound_proc_31.f90: New.
From-SVN: r205983
-rw-r--r-- | gcc/fortran/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/fortran/module.c | 33 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/typebound_proc_31.f90 | 28 |
4 files changed, 63 insertions, 8 deletions
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 <janus@gcc.gnu.org> + + PR fortran/59450 + * module.c (mio_expr): Handle type-bound function expressions. + 2013-12-12 Tobias Burnus <burnus@net-b.de> 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 <janus@gcc.gnu.org> + + PR fortran/59450 + * gfortran.dg/typebound_proc_31.f90: New. + 2013-12-13 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> * 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 <bugs@miller-mohr.de> + +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" } } |