re PR fortran/49397 ([F03] ICE with proc pointer assignment)
authorTobias Burnus <burnus@net-b.de>
Tue, 18 Feb 2014 22:09:39 +0000 (23:09 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Tue, 18 Feb 2014 22:09:39 +0000 (23:09 +0100)
2014-02-18  Tobias Burnus  <burnus@net-b.de>

        PR fortran/49397
        * expr.c (gfc_check_pointer_assign): Add check for
        F2008Cor2, C729.
        * trans-decl.c (gfc_get_symbol_decl): Correctly generate
        * external
        decl in a corner case.

2014-02-18  Tobias Burnus  <burnus@net-b.de>

        PR fortran/49397
        * gfortran.dg/proc_ptr_45.f90: New.
        * gfortran.dg/proc_ptr_46.f90: New.

From-SVN: r207854

gcc/fortran/ChangeLog
gcc/fortran/expr.c
gcc/fortran/trans-decl.c
gcc/testsuite/ChangeLog

index c1e5b6d..c1bca00 100644 (file)
@@ -1,3 +1,11 @@
+2014-02-18  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/49397
+       * expr.c (gfc_check_pointer_assign): Add check for
+       F2008Cor2, C729.
+       * trans-decl.c (gfc_get_symbol_decl): Correctly generate external
+       decl in a corner case.
+
 2014-02-18  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/60231
index 818212a..fe6eab5 100644 (file)
@@ -3581,6 +3581,16 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
          return false;
        }
 
+      /* Check F2008Cor2, C729.  */
+      if (!s2->attr.intrinsic && s2->attr.if_source == IFSRC_UNKNOWN
+         && !s2->attr.external && !s2->attr.subroutine && !s2->attr.function)
+       {
+         gfc_error ("Procedure pointer target '%s' at %L must be either an "
+                    "intrinsic, host or use associated, referenced or have "
+                    "the EXTERNAL attribute", s2->name, &rvalue->where);
+         return false;
+       }
+
       return true;
     }
 
index 9c86653..cf7b661 100644 (file)
@@ -1362,9 +1362,10 @@ gfc_get_symbol_decl (gfc_symbol * sym)
 
   if (sym->attr.flavor == FL_PROCEDURE)
     {
-      /* Catch function declarations. Only used for actual parameters,
+      /* Catch functions. Only used for actual parameters,
         procedure pointers and procptr initialization targets.  */
-      if (sym->attr.external || sym->attr.use_assoc || sym->attr.intrinsic)
+      if (sym->attr.use_assoc || sym->attr.intrinsic
+         || sym->attr.if_source != IFSRC_DECL)
        {
          decl = gfc_get_extern_function_decl (sym);
          gfc_set_decl_location (decl, &sym->declared_at);
index cd31dd9..780614c 100644 (file)
@@ -1,3 +1,9 @@
+2014-02-18  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/49397
+       * gfortran.dg/proc_ptr_45.f90: New.
+       * gfortran.dg/proc_ptr_46.f90: New.
+
 2014-02-18  Adam Butcher  <adam@jessamine.co.uk>
 
        PR c++/60190