* c-decl.c (grokfield): Make sure the only unnamed fields
authordj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Oct 2001 19:44:53 +0000 (19:44 +0000)
committerdj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Oct 2001 19:44:53 +0000 (19:44 +0000)
we're allowing are either structs or unions.
* doc/extend.texi: Add documentation for the unnamed field
extension.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@46088 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-decl.c
gcc/doc/extend.texi

index 532b727..4387656 100644 (file)
@@ -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.
index 4ec34ea..d167ddf 100644 (file)
@@ -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);
index 1ae858e..be65920 100644 (file)
@@ -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