summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2010-06-08 06:37:32 +0000
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2010-06-08 06:37:32 +0000
commit4e1f7cdd604ce719e2906cc612bca05c52a5f08a (patch)
treefaee54b2196b28339a9768a43ed57cbe759b5fb1
parent6d00b16b034ed93df97076a93a1113a8ccb286dd (diff)
downloadgcc-4e1f7cdd604ce719e2906cc612bca05c52a5f08a.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@160424 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/resolve.c13
-rw-r--r--gcc/fortran/symbol.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/proc_ptr_27.f9020
5 files changed, 44 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 78ee5a9ec8b..edb50382ee1 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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.
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 7e5a4f95773..e4c739430a8 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -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;
diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c
index b436de5e2af..adae49f1606 100644
--- a/gcc/fortran/symbol.c
+++ b/gcc/fortran/symbol.c
@@ -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_)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a32bcb0a853..239ef3eead6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..83f09598110
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/proc_ptr_27.f90
@@ -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" } }