summaryrefslogtreecommitdiff
path: root/gcc/fortran/symbol.c
diff options
context:
space:
mode:
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2014-10-06 05:57:57 +0000
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2014-10-06 05:57:57 +0000
commit0daab5039b8390c3be1335185fce7b6662c2fa75 (patch)
tree3fd948e1c22f57c5745797415d9f60822a38992e /gcc/fortran/symbol.c
parentdee71017a44ee3f4d9027c6ef98fb30aa1df06d8 (diff)
downloadgcc-0daab5039b8390c3be1335185fce7b6662c2fa75.tar.gz
2014-10-06 Tobias Burnus <burnus@net-b.de>
gcc/fortran/ * libgfortran.h (GFC_STD_F2015): Add. * decl.c (gfc_match_implicit_none): Handle spec list. (gfc_match_implicit): Move double intrinsic warning here. * gfortran.h (gfc_namespace): Add has_implicit_none_export:1. (gfc_set_implicit_none): Update interface. * interface.c (gfc_procedure_use): Add implicit-none external error check. * parse.c (accept_statement): Remove call. (verify_st_order): Permit that external-implict-none follows implicit statement. * symbol.c (gfc_set_implicit_none): Handle external/type implicit none. gcc/testsuite/ * gfortran.dg/implicit_14.f90: New. * gfortran.dg/implicit_15.f90: New. * gfortran.dg/implicit_4.f90: Update dg-error. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@215914 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/symbol.c')
-rw-r--r--gcc/fortran/symbol.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c
index 8e1d8b3b408..0ccbd1f204c 100644
--- a/gcc/fortran/symbol.c
+++ b/gcc/fortran/symbol.c
@@ -114,22 +114,34 @@ static int new_flag[GFC_LETTERS];
/* Handle a correctly parsed IMPLICIT NONE. */
void
-gfc_set_implicit_none (void)
+gfc_set_implicit_none (bool type, bool external)
{
int i;
- if (gfc_current_ns->seen_implicit_none)
+ if (gfc_current_ns->seen_implicit_none
+ || gfc_current_ns->has_implicit_none_export)
{
- gfc_error ("Duplicate IMPLICIT NONE statement at %C");
+ gfc_error_now ("Duplicate IMPLICIT NONE statement at %C");
return;
}
- gfc_current_ns->seen_implicit_none = 1;
+ if (external)
+ gfc_current_ns->has_implicit_none_export = 1;
- for (i = 0; i < GFC_LETTERS; i++)
+ if (type)
{
- gfc_clear_ts (&gfc_current_ns->default_type[i]);
- gfc_current_ns->set_flag[i] = 1;
+ gfc_current_ns->seen_implicit_none = 1;
+ for (i = 0; i < GFC_LETTERS; i++)
+ {
+ if (gfc_current_ns->set_flag[i])
+ {
+ gfc_error_now ("IMPLICIT NONE (type) statement at %C following an "
+ "IMPLICIT statement");
+ return;
+ }
+ gfc_clear_ts (&gfc_current_ns->default_type[i]);
+ gfc_current_ns->set_flag[i] = 1;
+ }
}
}
@@ -2383,6 +2395,9 @@ gfc_get_namespace (gfc_namespace *parent, int parent_types)
}
}
+ if (parent_types && ns->parent != NULL)
+ ns->has_implicit_none_export = ns->parent->has_implicit_none_export;
+
ns->refs = 1;
return ns;