diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9ecdf7272bdb..99a09badef9c 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,4 +1,9 @@ -2009-04-11 Daniel Franke +2009-04-11 Janus Weil + + PR fortran/39692 + * symbol.c (check_conflict): Reject procedure pointers for -std=f95. + +2009-04-11 Daniel Franke * resolve.c (resolve_global_procedure): Enable whole-file checking for procedures that are declared later in the file. diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index a4f43a5f6700..ea4946b88509 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -455,6 +455,10 @@ check_conflict (symbol_attribute *attr, const char *name, locus *where) if ((attr->if_source == IFSRC_DECL && !attr->procedure) || attr->contained) conf (external, subroutine); + if (attr->proc_pointer && gfc_notify_std (GFC_STD_F2003, + "Fortran 2003: Procedure pointer at %C") == FAILURE) + return FAILURE; + conf (allocatable, pointer); conf_std (allocatable, dummy, GFC_STD_F2003); conf_std (allocatable, function, GFC_STD_F2003); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aedd017f189a..4acc4b9d0010 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-04-11 Janus Weil + + PR fortran/39692 + * gfortran.dg/proc_ptr_14.f90: New. + 2009-04-11 Richard Guenther PR middle-end/39732 diff --git a/gcc/testsuite/gfortran.dg/proc_ptr_14.f90 b/gcc/testsuite/gfortran.dg/proc_ptr_14.f90 new file mode 100644 index 000000000000..90037a1a5ab8 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/proc_ptr_14.f90 @@ -0,0 +1,40 @@ +! { dg-do compile } +! { dg-options "-std=f95" } +! +! PR 39692: f95: conflict between EXTERNAL and POINTER +! +! Test for Procedure Pointers (without PROCEDURE statements) with the -std=f95 flag. +! +! Contributed by Janus Weil + +pointer :: f +external :: f ! { dg-error "Fortran 2003: Procedure pointer" } + +external :: g +pointer :: g ! { dg-error "Fortran 2003: Procedure pointer" } + +real, pointer, external :: h ! { dg-error "Fortran 2003: Procedure pointer" } + +interface + subroutine i + end subroutine i +end interface +pointer :: i ! { dg-error "Fortran 2003: Procedure pointer" } + +pointer :: j +interface + real function j() + end function j ! { dg-error "Fortran 2003: Procedure pointer" } +end interface + +contains + + function k() ! { dg-error "attribute conflicts with" } + intrinsic sin + external k + pointer k ! { dg-error "Fortran 2003: Procedure pointer" } + real k + end function k + +end +