summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorforeese <foreese@138bc75d-0d04-0410-961f-82ee72b054a4>2017-08-10 12:19:13 +0000
committerforeese <foreese@138bc75d-0d04-0410-961f-82ee72b054a4>2017-08-10 12:19:13 +0000
commit8ef2cf7635a18488c1b6ebce47510c7471f36232 (patch)
treedf39d4d0185d28f1f57d1ffac7bf3ade3be9c485
parentf4d53ac69701fdce011dc58f489fad6534a1cd91 (diff)
downloadgcc-8ef2cf7635a18488c1b6ebce47510c7471f36232.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@251023 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/decl.c56
-rw-r--r--gcc/fortran/gfortran.texi14
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/dec_structure_18.f9038
-rw-r--r--gcc/testsuite/gfortran.dg/dec_structure_19.f9038
-rw-r--r--gcc/testsuite/gfortran.dg/dec_structure_20.f9018
-rw-r--r--gcc/testsuite/gfortran.dg/dec_structure_21.f9010
8 files changed, 185 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 09138ab41ad..45b16d48b28 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 54ee5d3d2a6..b919f43cbd4 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 85afdda46ef..145ec7fb9ab 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:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 45fe28f2572..adae3b9bee2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2017-08-10 Fritz Reese <Reese-Fritz@zai.com>
+
+ * gfortran.dg/dec_structure_18.f90: New test.
+ * gfortran.dg/dec_structure_19.f90: New test.
+ * gfortran.dg/dec_structure_20.f90: New test.
+ * gfortran.dg/dec_structure_21.f90: New test.
+
2017-08-10 Marek Polacek <polacek@redhat.com>
PR testsuite/81784
diff --git a/gcc/testsuite/gfortran.dg/dec_structure_18.f90 b/gcc/testsuite/gfortran.dg/dec_structure_18.f90
new file mode 100644
index 00000000000..1e6b229216b
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_structure_18.f90
@@ -0,0 +1,38 @@
+ ! { dg-do run }
+ ! { dg-options "-fdec-structure -ffixed-form" }
+ !
+ ! Test the %FILL component extension.
+ !
+ implicit none
+
+ structure /s/
+ character(2) i
+ character(2) %fill
+ character(2) j
+ end structure
+
+ structure /s2/
+ character buf(6)
+ end structure
+
+ record /s/ x
+ record /s2/ y
+ equivalence (x, y)
+
+ x.i = '12'
+ x.j = '34'
+
+ if (y.buf(1) .ne. '1') then
+ call abort
+ endif
+ if (y.buf(2) .ne. '2') then
+ call abort
+ endif
+ if (y.buf(5) .ne. '3') then
+ call abort
+ endif
+ if (y.buf(6) .ne. '4') then
+ call abort
+ endif
+
+ end
diff --git a/gcc/testsuite/gfortran.dg/dec_structure_19.f90 b/gcc/testsuite/gfortran.dg/dec_structure_19.f90
new file mode 100644
index 00000000000..9ea0b3efe13
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_structure_19.f90
@@ -0,0 +1,38 @@
+! { dg-do compile }
+! { dg-options "-fdec-structure -ffree-form" }
+!
+! Test the %FILL component extension.
+!
+implicit none
+
+structure /s/
+ character(2) i
+ character(2) %fill
+ character(2) j
+end structure
+
+structure /s2/
+ character buf(6)
+end structure
+
+record /s/ x
+record /s2/ y
+equivalence (x, y)
+
+x.i = "12"
+x.j = "34"
+
+if (y.buf(1) .ne. '1') then
+ call abort
+endif
+if (y.buf(2) .ne. '2') then
+ call abort
+endif
+if (y.buf(5) .ne. '3') then
+ call abort
+endif
+if (y.buf(6) .ne. '4') then
+ call abort
+endif
+
+end
diff --git a/gcc/testsuite/gfortran.dg/dec_structure_20.f90 b/gcc/testsuite/gfortran.dg/dec_structure_20.f90
new file mode 100644
index 00000000000..9e952040076
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_structure_20.f90
@@ -0,0 +1,18 @@
+ ! { dg-do compile }
+ ! { dg-options "-fdec-structure" }
+ !
+ ! Test error handling for %FILL
+ !
+ implicit none
+
+ structure /s/
+ integer(2) i /3/
+ integer(2) %fill /4/ ! { dg-error "cannot have an initializer" }
+ integer(2), pointer :: %fill ! { dg-error "cannot have attributes" }
+ end structure
+
+ type t
+ integer %fill ! { dg-error "not allowed outside STRUCTURE" }
+ endtype
+
+ end
diff --git a/gcc/testsuite/gfortran.dg/dec_structure_21.f90 b/gcc/testsuite/gfortran.dg/dec_structure_21.f90
new file mode 100644
index 00000000000..64e8ca39e46
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_structure_21.f90
@@ -0,0 +1,10 @@
+ ! { dg-do compile }
+ ! { dg-options "-ffixed-form" }
+ !
+ ! Test errors for %FILL without -fdec-structure.
+ !
+ implicit none
+
+ character(2) %fill ! { dg-error "is a DEC extension" }
+
+ end