re PR fortran/39998 (Procedure Pointer Assignments: Statement Functions & Internal...
authorJanus Weil <janus@gcc.gnu.org>
Tue, 5 May 2009 20:41:00 +0000 (22:41 +0200)
committerJanus Weil <janus@gcc.gnu.org>
Tue, 5 May 2009 20:41:00 +0000 (22:41 +0200)
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

gcc/fortran/ChangeLog
gcc/fortran/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/proc_ptr_17.f90 [new file with mode: 0644]

index e60eca6..3e9c86a 100644 (file)
@@ -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
index e76197e..9fa0ff1 100644 (file)
@@ -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))
index 0d8407b..0a770b5 100644 (file)
@@ -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 (file)
index 0000000..20e059f
--- /dev/null
@@ -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
+