diff options
author | Janus Weil <janus@gcc.gnu.org> | 2009-05-05 22:41:00 +0200 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2009-05-05 22:41:00 +0200 |
commit | 210aee68d4960d85701e6a8b8a191635fe304d72 (patch) | |
tree | 1716ad44645c0dced67b539e95c06795c31fb21c /gcc | |
parent | 2650d9e15a08365a1d76f5065e4f46e92754c235 (diff) | |
download | gcc-210aee68d4960d85701e6a8b8a191635fe304d72.zip gcc-210aee68d4960d85701e6a8b8a191635fe304d72.tar.gz gcc-210aee68d4960d85701e6a8b8a191635fe304d72.tar.bz2 |
re PR fortran/39998 (Procedure Pointer Assignments: Statement Functions & Internal Functions)
2009-05-05 Janus Weil <janus@gcc.gnu.org>
PR fortran/39998
* expr.c (gfc_check_pointer_assign): Check for statement functions and
internal procedures in procedure pointer assignments.
2009-05-05 Janus Weil <janus@gcc.gnu.org>
PR fortran/39998
* gfortran.dg/proc_ptr_17.f90: New.
From-SVN: r147133
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/expr.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/proc_ptr_17.f90 | 16 |
4 files changed, 43 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index e60eca6..3e9c86a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2009-05-05 Janus Weil <janus@gcc.gnu.org> + + 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 <janus@gcc.gnu.org> PR fortran/39946 diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index e76197e..9fa0ff1 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 0d8407b..0a770b58 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-05-05 Janus Weil <janus@gcc.gnu.org> + + PR fortran/39998 + * gfortran.dg/proc_ptr_17.f90: New. + 2009-05-05 Richard Guenther <rguenther@suse.de> 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 0000000..20e059f --- /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 <burnus@net-b.de> + + 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 + |