From 7c1a49fa1b2535dcce600d03887e2c72a463cc2c Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Fri, 31 Dec 2010 11:20:22 +0000 Subject: [PATCH] re PR fortran/45338 (Failure on interfacing a function passed as an argument as a custom operator) 2010-12-31 Thomas Koenig PR fortran/45338 * resolve.c (resolve_operator): Mark function for user-defined operator as referenced. 2010-12-31 Thomas Koenig PR fortran/45338 * gfortran.dg/userdef_operator_2.f90: New test case. From-SVN: r168366 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/resolve.c | 9 ++++++--- gcc/testsuite/ChangeLog | 13 +++++++++---- .../gfortran.dg/userdef_operator_2.f90 | 17 +++++++++++++++++ 4 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/userdef_operator_2.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 696ad58ff2f..c2103314bef 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2010-12-31 Thomas Koenig + + PR fortran/45338 + * resolve.c (resolve_operator): Mark function for user-defined + operator as referenced. + 2010-12-31 Janus Weil PR fortran/46971 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 70811469f12..9a5dcc1040e 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -3793,9 +3793,12 @@ resolve_operator (gfc_expr *e) sprintf (msg, _("Operand of user operator '%s' at %%L is %s"), e->value.op.uop->name, gfc_typename (&op1->ts)); else - sprintf (msg, _("Operands of user operator '%s' at %%L are %s/%s"), - e->value.op.uop->name, gfc_typename (&op1->ts), - gfc_typename (&op2->ts)); + { + sprintf (msg, _("Operands of user operator '%s' at %%L are %s/%s"), + e->value.op.uop->name, gfc_typename (&op1->ts), + gfc_typename (&op2->ts)); + e->value.op.uop->op->sym->attr.referenced = 1; + } goto bad_op; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b8798c78555..4e4601de1bb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-12-31 Thomas Koenig + + PR fortran/45338 + * gfortran.dg/userdef_operator_2.f90: New test case. + 2010-12-31 Janus Weil PR fortran/46971 @@ -6,16 +11,16 @@ 2010-12-30 Nicola Pero * objc.dg/method-conflict-3.m: New. - * objc.dg/method-conflict-4.m: New. - * obj-c++.dg/method-conflict-3.m: New. + * objc.dg/method-conflict-4.m: New. + * obj-c++.dg/method-conflict-3.m: New. * obj-c++.dg/method-conflict-4.mm: New. 2010-12-30 Nicola Pero - + * objc.dg/class-extension-3.m: Updated. * objc.dg/method-1.m: Updated. * objc.dg/method-conflict-1.m: New. - * objc.dg/method-conflict-2.m: New. + * objc.dg/method-conflict-2.m: New. * obj-c++.dg/class-extension-3.mm: Updated. * obj-c++.dg/method-8.mm: Updated. * obj-c++.dg/method-conflict-1.mm: New. diff --git a/gcc/testsuite/gfortran.dg/userdef_operator_2.f90 b/gcc/testsuite/gfortran.dg/userdef_operator_2.f90 new file mode 100644 index 00000000000..83392c6b6c3 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/userdef_operator_2.f90 @@ -0,0 +1,17 @@ +! { dg-do compile } +! PR 45338 - no ICE when cmp is not used explicitly. +! Test case by Simon Smart +module test_mod + implicit none +contains + subroutine test_fn (cmp) + interface operator(.myop.) + pure function cmp (a, b) result(ret) + integer, intent(in) :: a, b + logical ret + end function cmp + end interface + integer :: a, b + print*, a .myop. b + end subroutine test_fn +end module test_mod