]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/44446 (Error with protected pocedure pointer)
authorTobias Burnus <burnus@net-b.de>
Tue, 8 Jun 2010 06:37:32 +0000 (08:37 +0200)
committerTobias Burnus <burnus@gcc.gnu.org>
Tue, 8 Jun 2010 06:37:32 +0000 (08:37 +0200)
2010-06-07  Tobias Burnus  <burnus@net-b.de>

        PR fortran/44446
        * symbol.c (check_conflict): Move protected--external/procedure
        check ...
        * resolve.c (resolve_select_type): ... to the resolution stage.

2010-06-07  Tobias Burnus  <burnus@net-b.de>

        PR fortran/44446
        * gfortran.dg/proc_ptr_27.f90: New.

From-SVN: r160424

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/fortran/symbol.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/proc_ptr_27.f90 [new file with mode: 0644]

index 78ee5a9ec8ba64816897587d1811a1a41c053041..edb50382ee1d120f5fe332bce26a565f23dc4dcc 100644 (file)
@@ -1,3 +1,9 @@
+2010-06-08  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/44446
+       * symbol.c (check_conflict): Move protected--external/procedure check ...
+       * resolve.c (resolve_select_type): ... to the resolution stage.
+
 2010-06-07  Tobias Burnus  <burnus@net-b.de>
 
        * options.c (gfc_handle_option): Fix -fno-recursive.
index 7e5a4f9577372b30a6ab9863262b77de94dc710d..e4c739430a84e397e781d4cff842cf274b897a45 100644 (file)
@@ -11311,6 +11311,19 @@ resolve_symbol (gfc_symbol *sym)
        }
     }
 
+  if (sym->attr.is_protected && !sym->attr.proc_pointer
+      && (sym->attr.procedure || sym->attr.external))
+    {
+      if (sym->attr.external)
+       gfc_error ("PROTECTED attribute conflicts with EXTERNAL attribute "
+                  "at %L", &sym->declared_at);
+      else
+       gfc_error ("PROCEDURE attribute conflicts with PROTECTED attribute "
+                  "at %L", &sym->declared_at);
+
+      return;
+    }
+
   if (sym->attr.flavor == FL_DERIVED && resolve_fl_derived (sym) == FAILURE)
     return;
 
index b436de5e2af822c65fb865c737b24ef3a06e6ad2..adae49f16062995111a9ffd9d062827ce6d1aaed 100644 (file)
@@ -567,7 +567,6 @@ check_conflict (symbol_attribute *attr, const char *name, locus *where)
     }
 
   conf (is_protected, intrinsic)
-  conf (is_protected, external)
   conf (is_protected, in_common)
 
   conf (asynchronous, intrinsic)
@@ -587,7 +586,6 @@ check_conflict (symbol_attribute *attr, const char *name, locus *where)
   conf (procedure, dimension)
   conf (procedure, codimension)
   conf (procedure, intrinsic)
-  conf (procedure, is_protected)
   conf (procedure, target)
   conf (procedure, value)
   conf (procedure, volatile_)
index a32bcb0a853cf898516547a1c2094e42bc9406d0..239ef3eead6e18c97a7b8a42304803bbcacde902 100644 (file)
@@ -1,3 +1,8 @@
+2010-06-07  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/44446
+       * gfortran.dg/proc_ptr_27.f90: New.
+
 2010-06-07  Jason Merrill  <jason@redhat.com>
 
        PR c++/44366
diff --git a/gcc/testsuite/gfortran.dg/proc_ptr_27.f90 b/gcc/testsuite/gfortran.dg/proc_ptr_27.f90
new file mode 100644 (file)
index 0000000..83f0959
--- /dev/null
@@ -0,0 +1,20 @@
+! { dg-do compile }
+!
+! PR fortran/44446
+!
+! Contributed by Marco Restelli.
+!
+! Procedure pointer with PROTECTED was wrongly rejected.
+!
+module m
+ implicit none
+ abstract interface
+  pure function i_f(x) result(y)
+   real, intent(in) :: x
+   real :: y
+  end function i_f
+ end interface
+ procedure(i_f), pointer, protected :: p_f => null()
+end module m
+
+! { dg-final { cleanup-modules "m" } }