diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 8d8e000e15a..7ef40e0cdae 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2005-04-29 Tobias Schl"uter + + * gfortran.h (gfc_namespace): Add seen_implicit_none field. + * symbol.c (gfc_set_implicit_none): Give error if there's a previous + IMPLICIT NONE, set seen_implicit_none. + (gfc_merge_new_implicit): Error if there's an IMPLICIT NONE statement. + 2005-04-28 Tobias Schl"uter * gfortran.h (gfc_gsymbol): Make name a const char *. diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index 6906b81cc23..5fb9f53db87 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -106,6 +106,14 @@ gfc_set_implicit_none (void) { int i; + if (gfc_current_ns->seen_implicit_none) + { + gfc_error ("Duplicate IMPLICIT NONE statement at %C"); + return; + } + + gfc_current_ns->seen_implicit_none = 1; + for (i = 0; i < GFC_LETTERS; i++) { gfc_clear_ts (&gfc_current_ns->default_type[i]); @@ -160,6 +168,12 @@ gfc_merge_new_implicit (gfc_typespec * ts) { int i; + if (gfc_current_ns->seen_implicit_none) + { + gfc_error ("Cannot specify IMPLICIT at %C after IMPLICIT NONE"); + return FAILURE; + } + for (i = 0; i < GFC_LETTERS; i++) { if (new_flag[i]) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 41354462589..0ab6998a33a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,9 +1,13 @@ -2004-04-28 Bob Wilson +2005-04-29 Tobias Schl"uter + + * gfortran.dg/implicit_4.f90: New test. + +2005-04-28 Bob Wilson * lib/target-supports.exp (check_profiling_available): Return false for xtensa-*-elf. -2004-04-29 David Billinghurst (David.Billinghurst@riotinto.com) +2005-04-29 David Billinghurst (David.Billinghurst@riotinto.com) * lib/fortran-torture.exp (fortran-torture.exp): Catch error if file cannot be deleted. diff --git a/gcc/testsuite/gfortran.dg/implicit_4.f90 b/gcc/testsuite/gfortran.dg/implicit_4.f90 new file mode 100644 index 00000000000..2e871b09d89 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/implicit_4.f90 @@ -0,0 +1,21 @@ +! { dg-do compile } +! Verify error diagnosis for invalid combinations of IMPLICIT statements +IMPLICIT NONE +IMPLICIT NONE ! { dg-error "Duplicate" } +END + +SUBROUTINE a +IMPLICIT REAL(b-j) ! { dg-error "cannot follow" } +implicit none ! { dg-error "cannot follow" } +END SUBROUTINE a + +subroutine b +implicit none +implicit real(g-k) ! { dg-error "Cannot specify" } +end subroutine b + +subroutine c +implicit real(a-b) +implicit integer (b-c) ! { dg-error "already" } +implicit real(d-f), complex(f-g) ! { dg-error "already" } +end subroutine c