aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/module.c12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/typebound_operator_14.f9042
4 files changed, 64 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 2a7cc28..794101b 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2012-02-01 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/52024
+ * module.c (MOD_VERSION): Bump.
+ (mio_typebound_proc): Read/write is_operator from/to the
+ .mod file.
+
2012-02-01 Tobias Burnus
PR fortran/52059
diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c
index c68277b..5e0f26e 100644
--- a/gcc/fortran/module.c
+++ b/gcc/fortran/module.c
@@ -81,7 +81,7 @@ along with GCC; see the file COPYING3. If not see
/* Don't put any single quote (') in MOD_VERSION,
if yout want it to be recognized. */
-#define MOD_VERSION "8"
+#define MOD_VERSION "9"
/* Structure that describes a position within a module file. */
@@ -3578,12 +3578,17 @@ mio_typebound_proc (gfc_typebound_proc** proc)
if ((*proc)->is_generic)
{
gfc_tbp_generic* g;
+ int iop;
mio_lparen ();
if (iomode == IO_OUTPUT)
for (g = (*proc)->u.generic; g; g = g->next)
- mio_allocated_string (g->specific_st->name);
+ {
+ iop = (int) g->is_operator;
+ mio_integer (&iop);
+ mio_allocated_string (g->specific_st->name);
+ }
else
{
(*proc)->u.generic = NULL;
@@ -3594,6 +3599,9 @@ mio_typebound_proc (gfc_typebound_proc** proc)
g = gfc_get_tbp_generic ();
g->specific = NULL;
+ mio_integer (&iop);
+ g->is_operator = (bool) iop;
+
require_atom (ATOM_STRING);
sym_root = &current_f2k_derived->tb_sym_root;
g->specific_st = gfc_get_tbp_symtree (sym_root, atom_string);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 95b1ece..9e655c8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-02-01 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/52024
+ * gfortran.dg/typebound_operator_14.f90: New.
+
2012-02-01 Tobias Burnus
PR fortran/52059
diff --git a/gcc/testsuite/gfortran.dg/typebound_operator_14.f90 b/gcc/testsuite/gfortran.dg/typebound_operator_14.f90
new file mode 100644
index 0000000..86c65d77
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/typebound_operator_14.f90
@@ -0,0 +1,42 @@
+! { dg-do compile }
+!
+! PR fortran/52024
+!
+! The test case was segfaulting before
+!
+
+module m_sort
+ implicit none
+ type, abstract :: sort_t
+ contains
+ generic :: operator(.gt.) => gt_cmp
+ procedure :: gt_cmp
+ end type sort_t
+contains
+ logical function gt_cmp(a,b)
+ class(sort_t), intent(in) :: a, b
+ gt_cmp = .true.
+ end function gt_cmp
+end module
+
+module test
+ use m_sort
+ implicit none
+ type, extends(sort_t) :: sort_int_t
+ integer :: i
+ contains
+ generic :: operator(.gt.) => gt_cmp_int ! { dg-error "are ambiguous" }
+ procedure :: gt_cmp_int
+ end type
+contains
+ logical function gt_cmp_int(a,b) result(cmp)
+ class(sort_int_t), intent(in) :: a, b
+ if (a%i > b%i) then
+ cmp = .true.
+ else
+ cmp = .false.
+ end if
+ end function gt_cmp_int
+end module
+
+! { dg-final { cleanup-tree-dump "m_sort test" } }