Commit a6c63173 by Tobias Burnus Committed by Tobias Burnus

gfortran.h (gfc_set_implicit_none): Update prototype.

2014-10-10  Tobias Burnus  <burnus@net-b.de>

gcc/fortran/
        * gfortran.h (gfc_set_implicit_none): Update prototype.
        * symbol.c (gfc_set_implicit_none): Take and
        use error location. Move diagnostic from here to ...
        * decl.c (gfc_match_implicit_none): ... here. And
        update call. Handle empty implicit-none-spec.
        (gfc_match_implicit): Handle statement-separator ";".

gcc/testsuite/
        * gfortran.dg/implicit_16.f90: New.

From-SVN: r216057
parent 548cb3d7
2014-10-10 Tobias Burnus <burnus@net-b.de>
* gfortran.h (gfc_set_implicit_none): Update prototype.
* symbol.c (gfc_set_implicit_none): Take and
use error location. Move diagnostic from here to ...
* decl.c (gfc_match_implicit_none): ... here. And
update call. Handle empty implicit-none-spec.
(gfc_match_implicit): Handle statement-separator ";".
2014-10-09 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> 2014-10-09 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
* f95-lang.c (gfc_init_builtin_functions): Add more floating-point * f95-lang.c (gfc_init_builtin_functions): Add more floating-point
......
...@@ -2951,6 +2951,14 @@ gfc_match_implicit_none (void) ...@@ -2951,6 +2951,14 @@ gfc_match_implicit_none (void)
char name[GFC_MAX_SYMBOL_LEN + 1]; char name[GFC_MAX_SYMBOL_LEN + 1];
bool type = false; bool type = false;
bool external = false; bool external = false;
locus cur_loc = gfc_current_locus;
if (gfc_current_ns->seen_implicit_none
|| gfc_current_ns->has_implicit_none_export)
{
gfc_error ("Duplicate IMPLICIT NONE statement at %C");
return MATCH_ERROR;
}
gfc_gobble_whitespace (); gfc_gobble_whitespace ();
c = gfc_peek_ascii_char (); c = gfc_peek_ascii_char ();
...@@ -2959,6 +2967,14 @@ gfc_match_implicit_none (void) ...@@ -2959,6 +2967,14 @@ gfc_match_implicit_none (void)
(void) gfc_next_ascii_char (); (void) gfc_next_ascii_char ();
if (!gfc_notify_std (GFC_STD_F2015, "IMPORT NONE with spec list at %C")) if (!gfc_notify_std (GFC_STD_F2015, "IMPORT NONE with spec list at %C"))
return MATCH_ERROR; return MATCH_ERROR;
gfc_gobble_whitespace ();
if (gfc_peek_ascii_char () == ')')
{
(void) gfc_next_ascii_char ();
type = true;
}
else
for(;;) for(;;)
{ {
m = gfc_match (" %n", name); m = gfc_match (" %n", name);
...@@ -2987,7 +3003,7 @@ gfc_match_implicit_none (void) ...@@ -2987,7 +3003,7 @@ gfc_match_implicit_none (void)
if (gfc_match_eos () != MATCH_YES) if (gfc_match_eos () != MATCH_YES)
return MATCH_ERROR; return MATCH_ERROR;
gfc_set_implicit_none (type, external); gfc_set_implicit_none (type, external, &cur_loc);
return MATCH_YES; return MATCH_YES;
} }
...@@ -3140,8 +3156,8 @@ gfc_match_implicit (void) ...@@ -3140,8 +3156,8 @@ gfc_match_implicit (void)
{ {
/* We may have <TYPE> (<RANGE>). */ /* We may have <TYPE> (<RANGE>). */
gfc_gobble_whitespace (); gfc_gobble_whitespace ();
c = gfc_next_ascii_char (); c = gfc_peek_ascii_char ();
if ((c == '\n') || (c == ',')) if (c == ',' || c == '\n' || c == ';' || c == '!')
{ {
/* Check for CHARACTER with no length parameter. */ /* Check for CHARACTER with no length parameter. */
if (ts.type == BT_CHARACTER && !ts.u.cl) if (ts.type == BT_CHARACTER && !ts.u.cl)
...@@ -3155,6 +3171,10 @@ gfc_match_implicit (void) ...@@ -3155,6 +3171,10 @@ gfc_match_implicit (void)
/* Record the Successful match. */ /* Record the Successful match. */
if (!gfc_merge_new_implicit (&ts)) if (!gfc_merge_new_implicit (&ts))
return MATCH_ERROR; return MATCH_ERROR;
if (c == ',')
c = gfc_next_ascii_char ();
else if (gfc_match_eos () == MATCH_ERROR)
goto error;
continue; continue;
} }
...@@ -3190,7 +3210,7 @@ gfc_match_implicit (void) ...@@ -3190,7 +3210,7 @@ gfc_match_implicit (void)
gfc_gobble_whitespace (); gfc_gobble_whitespace ();
c = gfc_next_ascii_char (); c = gfc_next_ascii_char ();
if ((c != '\n') && (c != ',')) if (c != ',' && gfc_match_eos () != MATCH_YES)
goto syntax; goto syntax;
if (!gfc_merge_new_implicit (&ts)) if (!gfc_merge_new_implicit (&ts))
......
...@@ -2759,7 +2759,7 @@ extern int gfc_character_storage_size; ...@@ -2759,7 +2759,7 @@ extern int gfc_character_storage_size;
void gfc_clear_new_implicit (void); void gfc_clear_new_implicit (void);
bool gfc_add_new_implicit_range (int, int); bool gfc_add_new_implicit_range (int, int);
bool gfc_merge_new_implicit (gfc_typespec *); bool gfc_merge_new_implicit (gfc_typespec *);
void gfc_set_implicit_none (bool, bool); void gfc_set_implicit_none (bool, bool, locus *);
void gfc_check_function_type (gfc_namespace *); void gfc_check_function_type (gfc_namespace *);
bool gfc_is_intrinsic_typename (const char *); bool gfc_is_intrinsic_typename (const char *);
......
...@@ -114,17 +114,10 @@ static int new_flag[GFC_LETTERS]; ...@@ -114,17 +114,10 @@ static int new_flag[GFC_LETTERS];
/* Handle a correctly parsed IMPLICIT NONE. */ /* Handle a correctly parsed IMPLICIT NONE. */
void void
gfc_set_implicit_none (bool type, bool external) gfc_set_implicit_none (bool type, bool external, locus *loc)
{ {
int i; int i;
if (gfc_current_ns->seen_implicit_none
|| gfc_current_ns->has_implicit_none_export)
{
gfc_error_now ("Duplicate IMPLICIT NONE statement at %C");
return;
}
if (external) if (external)
gfc_current_ns->has_implicit_none_export = 1; gfc_current_ns->has_implicit_none_export = 1;
...@@ -135,8 +128,8 @@ gfc_set_implicit_none (bool type, bool external) ...@@ -135,8 +128,8 @@ gfc_set_implicit_none (bool type, bool external)
{ {
if (gfc_current_ns->set_flag[i]) if (gfc_current_ns->set_flag[i])
{ {
gfc_error_now ("IMPLICIT NONE (type) statement at %C following an " gfc_error_now ("IMPLICIT NONE (type) statement at %L following an "
"IMPLICIT statement"); "IMPLICIT statement", loc);
return; return;
} }
gfc_clear_ts (&gfc_current_ns->default_type[i]); gfc_clear_ts (&gfc_current_ns->default_type[i]);
......
2014-10-10 Tobias Burnus <burnus@net-b.de>
* gfortran.dg/implicit_16.f90: New.
2014-10-09 Paolo Carlini <paolo.carlini@oracle.com> 2014-10-09 Paolo Carlini <paolo.carlini@oracle.com>
* g++.dg/cpp0x/constexpr-using3.C: New. * g++.dg/cpp0x/constexpr-using3.C: New.
......
! { dg-do compile }
! { dg-options "" }
!
! Support Fortran 2015's IMPLICIT NONE with empty spec list
!
! And IMPLICIT with ";" followed by an additional statement.
! Contributed by Alan Greynolds
!
module m
type t
end type t
end module m
subroutine sub0
implicit integer (a-h,o-z); parameter (i=0)
end subroutine sub0
subroutine sub1
implicit integer (a-h,o-z)!test
parameter (i=0)
end subroutine sub1
subroutine sub2
use m
implicit type(t) (a-h,o-z); parameter (i=0)
end subroutine sub2
subroutine sub3
use m
implicit type(t) (a-h,o-z)! Foobar
parameter (i=0)
end subroutine sub3
subroutine sub4
implicit none ()
call test()
i = 1 ! { dg-error "Symbol 'i' at .1. has no IMPLICIT type" }
end subroutine sub4
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment