diff options
author | domob <domob@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-09-02 08:13:21 +0000 |
---|---|---|
committer | domob <domob@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-09-02 08:13:21 +0000 |
commit | ac5f26505c0462a4832f0fb86ccb0cce768e0e64 (patch) | |
tree | 632874704a2f440f9696fa8dc31ad80c794354ec /gcc/fortran/decl.c | |
parent | d0e6a121680aed3c07479ec6ac2e8384482b882c (diff) | |
download | gcc-ac5f26505c0462a4832f0fb86ccb0cce768e0e64.tar.gz |
2008-09-02 Daniel Kraft <d@domob.eu>
* gfortran.h (struct gfc_namespace): New member `implicit_loc'.
(gfc_add_abstract): New method.
* decl.c (gfc_get_type_attr_spec): Match ABSTRACT attribute.
(gfc_match_derived_decl): Copy abstract attribute in derived symbol.
* dump-parse-tree.c (show_attr): Show ABSTRACT attribute as `ABSTRACT'
only to allow for ABSTRACT types.
* parse.c (parse_interface): Use new gfc_add_abstract.
* primary.c (gfc_match_structure_constructor): Check that no ABSTRACT
type is constructed.
* resolve.c (resolve_typespec_used): New method.
(resolve_fl_derived): Check type in respect to ABSTRACT attribute and
check that no component is of an ABSTRACT type.
(resolve_symbol): Check that no symbol is of an ABSTRACT type.
(resolve_types): Check IMPLICIT declarations for ABSTRACT types.
* symbol.c (gfc_merge_new_implicit): Remember loci of IMPLICIT's.
(gfc_add_abstract): New method.
2008-09-02 Daniel Kraft <d@domob.eu>
* gfortran.dg/abstract_type_1.f90: New test.
* gfortran.dg/abstract_type_2.f03: New test.
* gfortran.dg/abstract_type_3.f03: New test.
* gfortran.dg/abstract_type_4.f03: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@139885 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/decl.c')
-rw-r--r-- | gcc/fortran/decl.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index b3ec1a66e22..7e4cabf21ad 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -6361,7 +6361,7 @@ gfc_get_type_attr_spec (symbol_attribute *attr, char *name) if (gfc_add_access (attr, ACCESS_PUBLIC, NULL, NULL) == FAILURE) return MATCH_ERROR; } - else if (gfc_match(" , bind ( c )") == MATCH_YES) + else if (gfc_match (" , bind ( c )") == MATCH_YES) { /* If the type is defined to be bind(c) it then needs to make sure that all fields are interoperable. This will @@ -6372,6 +6372,15 @@ gfc_get_type_attr_spec (symbol_attribute *attr, char *name) /* TODO: attr conflicts need to be checked, probably in symbol.c. */ } + else if (gfc_match (" , abstract") == MATCH_YES) + { + if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ABSTRACT type at %C") + == FAILURE) + return MATCH_ERROR; + + if (gfc_add_abstract (attr, &gfc_current_locus) == FAILURE) + return MATCH_ERROR; + } else if (name && gfc_match(" , extends ( %n )", name) == MATCH_YES) { if (gfc_add_extension (attr, &gfc_current_locus) == FAILURE) @@ -6479,11 +6488,9 @@ gfc_match_derived_decl (void) if (attr.is_bind_c != 0) sym->attr.is_bind_c = attr.is_bind_c; - /* Construct the f2k_derived namespace if it is not yet there. */ if (!sym->f2k_derived) sym->f2k_derived = gfc_get_namespace (NULL, 0); - if (extended && !sym->components) { @@ -6507,6 +6514,9 @@ gfc_match_derived_decl (void) st->n.sym = sym; } + /* Take over the ABSTRACT attribute. */ + sym->attr.abstract = attr.abstract; + gfc_new_block = sym; return MATCH_YES; |