diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index e60eca618d3..3e9c86ad92b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2009-05-05 Janus Weil + + PR fortran/39998 + * expr.c (gfc_check_pointer_assign): Check for statement functions and + internal procedures in procedure pointer assignments. + 2009-04-28 Janus Weil PR fortran/39946 diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index e76197e5338..9fa0ff13637 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -3148,6 +3148,22 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue) rvalue->symtree->name, &rvalue->where); return FAILURE; } + /* Check for C727. */ + if (attr.flavor == FL_PROCEDURE) + { + if (attr.proc == PROC_ST_FUNCTION) + { + gfc_error ("Statement function '%s' is invalid " + "in procedure pointer assignment at %L", + rvalue->symtree->name, &rvalue->where); + return FAILURE; + } + if (attr.proc == PROC_INTERNAL && + gfc_notify_std (GFC_STD_F2008, "Internal procedure '%s' is " + "invalid in procedure pointer assignment at %L", + rvalue->symtree->name, &rvalue->where) == FAILURE) + return FAILURE; + } if (rvalue->expr_type == EXPR_VARIABLE && !gfc_compare_interfaces (lvalue->symtree->n.sym, rvalue->symtree->n.sym, 0)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0d8407b2ffd..0a770b58d40 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-05-05 Janus Weil + + PR fortran/39998 + * gfortran.dg/proc_ptr_17.f90: New. + 2009-05-05 Richard Guenther PR tree-optimization/40022 diff --git a/gcc/testsuite/gfortran.dg/proc_ptr_17.f90 b/gcc/testsuite/gfortran.dg/proc_ptr_17.f90 new file mode 100644 index 00000000000..20e059fca3a --- /dev/null +++ b/gcc/testsuite/gfortran.dg/proc_ptr_17.f90 @@ -0,0 +1,16 @@ +! { dg-do compile } +! { dg-options "-std=f2003" } +! +! PR39998: Procedure Pointer Assignments: Statement Functions & Internal Functions. +! +! Contributed by Tobias Burnus + + procedure(), pointer :: p + f(x) = x**2 + p => f ! { dg-error "invalid in procedure pointer assignment" } + p => sub ! { dg-error "invalid in procedure pointer assignment" } +contains + subroutine sub + end subroutine sub +end +