aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDJ Delorie <dj@redhat.com>2001-10-08 15:44:53 -0400
committerDJ Delorie <dj@gcc.gnu.org>2001-10-08 15:44:53 -0400
commit3e96a2fd0c33ebf78db50bf040624b7cbf8f86b6 (patch)
tree57957d9b9f531e9eefc55ddc7c9826a3fc7e0004
parent1dde5a4edc74e724f3881ad730a7db116e34ecc4 (diff)
downloadgcc-3e96a2fd0c33ebf78db50bf040624b7cbf8f86b6.zip
gcc-3e96a2fd0c33ebf78db50bf040624b7cbf8f86b6.tar.gz
gcc-3e96a2fd0c33ebf78db50bf040624b7cbf8f86b6.tar.bz2
c-decl.c (grokfield): Make sure the only unnamed fields we're allowing are either structs or unions.
* c-decl.c (grokfield): Make sure the only unnamed fields we're allowing are either structs or unions. * doc/extend.texi: Add documentation for the unnamed field extension. From-SVN: r46088
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/c-decl.c12
-rw-r--r--gcc/doc/extend.texi42
3 files changed, 61 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 532b727..4387656 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2001-10-08 DJ Delorie <dj@redhat.com>
+
+ * c-decl.c (grokfield): Make sure the only unnamed fields
+ we're allowing are either structs or unions.
+ * doc/extend.texi: Add documentation for the unnamed field
+ extension.
+
2001-10-08 Zack Weinberg <zack@codesourcery.com>
* aclocal.m4 (gcc_AC_PROG_GNAT): New.
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 4ec34ea..d167ddf 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -5392,6 +5392,18 @@ grokfield (filename, line, declarator, declspecs, width)
{
tree value;
+ if (declarator == NULL_TREE && width == NULL_TREE)
+ {
+ /* This is an unnamed decl. We only support unnamed
+ structs/unions, so check for other things and refuse them. */
+ if (TREE_CODE (TREE_VALUE (declspecs)) != RECORD_TYPE
+ && TREE_CODE (TREE_VALUE (declspecs)) != UNION_TYPE)
+ {
+ error ("unnamed fields of type other than struct or union are not allowed");
+ return NULL_TREE;
+ }
+ }
+
value = grokdeclarator (declarator, declspecs, width ? BITFIELD : FIELD, 0);
finish_decl (value, NULL_TREE, NULL_TREE);
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 1ae858e..be659203 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -433,6 +433,7 @@ extensions, accepted by GCC in C89 mode and in C++.
* Vector Extensions:: Using vector instructions through built-in functions.
* Other Builtins:: Other built-in functions.
* Pragmas:: Pragmas accepted by GCC.
+* Unnamed Fields:: Unnamed struct/union fields within structs/unions.
@end menu
@end ifset
@ifclear INTERNALS
@@ -4503,6 +4504,47 @@ that of the @code{unused} attribute, except that this pragma may appear
anywhere within the variables' scopes.
@end table
+@node Unnamed Fields
+@section Unnamed struct/union fields within structs/unions.
+@cindex struct
+@cindex union
+
+For compatibility with other compilers, GCC allows you to define
+a structure or union that contains, as fields, structures and unions
+without names. For example:
+
+@example
+struct @{
+ int a;
+ union @{
+ int b;
+ float c;
+ @};
+ int d;
+@} foo;
+@end example
+
+In this example, the user would be able to access members of the unnamed
+union with code like @samp{foo.b}. Note that only unnamed structs and
+unions are allowed, you may not have, for example, an unnamed
+@code{int}.
+
+You must never create such structures that cause ambiguous field definitions.
+For example, this structure:
+
+@example
+struct @{
+ int a;
+ struct @{
+ int a;
+ @};
+@} foo;
+@end example
+
+It is ambiguous which @code{a} is being referred to with @samp{foo.a}.
+Such constructs are not supported and must be avoided. In the future,
+such constructs may be detected and treated as compilation errors.
+
@node C++ Extensions
@chapter Extensions to the C++ Language
@cindex extensions, C++ language