diff options
author | Fritz Reese <Reese-Fritz@zai.com> | 2017-08-10 12:19:13 +0000 |
---|---|---|
committer | Fritz Reese <foreese@gcc.gnu.org> | 2017-08-10 12:19:13 +0000 |
commit | 6f855a26ab2d30bc7f3b0cfec456e2b27e63b9a7 (patch) | |
tree | df39d4d0185d28f1f57d1ffac7bf3ade3be9c485 /gcc/fortran | |
parent | f234f0787e0ab940d49d9e90911c089bcb35d7f1 (diff) | |
download | gcc-6f855a26ab2d30bc7f3b0cfec456e2b27e63b9a7.zip gcc-6f855a26ab2d30bc7f3b0cfec456e2b27e63b9a7.tar.gz gcc-6f855a26ab2d30bc7f3b0cfec456e2b27e63b9a7.tar.bz2 |
decl.c (attr_seen): New static variable.
2017-08-10 Fritz Reese <Reese-Fritz@zai.com>
gcc/fortran/ChangeLog:
* decl.c (attr_seen): New static variable.
* decl.c (variable_decl): Match %FILL in STRUCTURE body.
* gfortran.texi: Update documentation.
gcc/testsuite/ChangeLog:
gfortran.dg/
* dec_structure_18.f90, dec_structure_19.f90, dec_structure_20.f90,
dec_structure_21.f90: New.
From-SVN: r251023
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 56 | ||||
-rw-r--r-- | gcc/fortran/gfortran.texi | 14 |
3 files changed, 74 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 09138ab4..45b16d4 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2017-08-10 Fritz Reese <Reese-Fritz@zai.com> + + * decl.c (attr_seen): New static variable. + * decl.c (variable_decl): Match %FILL in STRUCTURE body. + * gfortran.texi: Update documentation. + 2017-08-08 Martin Liska <mliska@suse.cz> * trans-types.c: Include header files. diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 54ee5d3..b919f43 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -54,6 +54,7 @@ static gfc_typespec current_ts; static symbol_attribute current_attr; static gfc_array_spec *current_as; static int colon_seen; +static int attr_seen; /* The current binding label (if any). */ static const char* curr_binding_label; @@ -2140,6 +2141,7 @@ static match variable_decl (int elem) { char name[GFC_MAX_SYMBOL_LEN + 1]; + static unsigned int fill_id = 0; gfc_expr *initializer, *char_len; gfc_array_spec *as; gfc_array_spec *cp_as; /* Extra copy for Cray Pointees. */ @@ -2157,9 +2159,47 @@ variable_decl (int elem) /* When we get here, we've just matched a list of attributes and maybe a type and a double colon. The next thing we expect to see is the name of the symbol. */ - m = gfc_match_name (name); + + /* If we are parsing a structure with legacy support, we allow the symbol + name to be '%FILL' which gives it an anonymous (inaccessible) name. */ + m = MATCH_NO; + gfc_gobble_whitespace (); + if (gfc_peek_ascii_char () == '%') + { + gfc_next_ascii_char (); + m = gfc_match ("fill"); + } + if (m != MATCH_YES) - goto cleanup; + { + m = gfc_match_name (name); + if (m != MATCH_YES) + goto cleanup; + } + + else + { + m = MATCH_ERROR; + if (gfc_current_state () != COMP_STRUCTURE) + { + if (flag_dec_structure) + gfc_error ("%qs not allowed outside STRUCTURE at %C", "%FILL"); + else + gfc_error ("%qs at %C is a DEC extension, enable with " + "%<-fdec-structure%>", "%FILL"); + goto cleanup; + } + + if (attr_seen) + { + gfc_error ("%qs entity cannot have attributes at %C", "%FILL"); + goto cleanup; + } + + /* %FILL components are given invalid fortran names. */ + snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "%%FILL%u", fill_id++); + m = MATCH_YES; + } var_locus = gfc_current_locus; @@ -2260,6 +2300,14 @@ variable_decl (int elem) } } + /* %FILL components may not have initializers. */ + if (strncmp (name, "%FILL", 5) == 0 && gfc_match_eos () != MATCH_YES) + { + gfc_error ("%qs entity cannot have an initializer at %C", "%FILL"); + m = MATCH_ERROR; + goto cleanup; + } + /* If this symbol has already shown up in a Cray Pointer declaration, and this is not a component declaration, then we want to set the type & bail out. */ @@ -3860,6 +3908,7 @@ match_attr_spec (void) current_as = NULL; colon_seen = 0; + attr_seen = 0; /* See if we get all of the keywords up to the final double colon. */ for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++) @@ -4228,6 +4277,8 @@ match_attr_spec (void) { if (seen[d] == 0) continue; + else + attr_seen = 1; if ((d == DECL_STATIC || d == DECL_AUTOMATIC) && !flag_dec_static) @@ -4436,6 +4487,7 @@ cleanup: gfc_current_locus = start; gfc_free_array_spec (current_as); current_as = NULL; + attr_seen = 0; return m; } diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi index 85afdda..145ec7f 100644 --- a/gcc/fortran/gfortran.texi +++ b/gcc/fortran/gfortran.texi @@ -2220,6 +2220,20 @@ rules and exceptions: @item Structures act like derived types with the @code{SEQUENCE} attribute. Otherwise they may contain no specifiers. +@item Structures may contain a special field with the name @code{%FILL}. +This will create an anonymous component which cannot be accessed but occupies +space just as if a component of the same type was declared in its place, useful +for alignment purposes. As an example, the following structure will consist +of at least sixteen bytes: + +@smallexample +structure /padded/ + character(4) start + character(8) %FILL + character(4) end +end structure +@end smallexample + @item Structures may share names with other symbols. For example, the following is invalid for derived types, but valid for structures: |