aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorFritz Reese <Reese-Fritz@zai.com>2017-08-10 12:19:13 +0000
committerFritz Reese <foreese@gcc.gnu.org>2017-08-10 12:19:13 +0000
commit6f855a26ab2d30bc7f3b0cfec456e2b27e63b9a7 (patch)
treedf39d4d0185d28f1f57d1ffac7bf3ade3be9c485 /gcc/fortran
parentf234f0787e0ab940d49d9e90911c089bcb35d7f1 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/fortran/decl.c56
-rw-r--r--gcc/fortran/gfortran.texi14
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: