diff options
author | Tobias Burnus <burnus@net-b.de> | 2010-06-08 08:37:32 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2010-06-08 08:37:32 +0200 |
commit | c064bf1cefe997074dcc4fec96317a63335634af (patch) | |
tree | faee54b2196b28339a9768a43ed57cbe759b5fb1 | |
parent | af88c58fb826aad723367d1b1ac09b6b64c87c68 (diff) | |
download | gcc-c064bf1cefe997074dcc4fec96317a63335634af.tar.gz |
re PR fortran/44446 (Error with protected pocedure pointer)
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
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 13 | ||||
-rw-r--r-- | gcc/fortran/symbol.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/proc_ptr_27.f90 | 20 |
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" } } |