From 3e96a2fd0c33ebf78db50bf040624b7cbf8f86b6 Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Mon, 8 Oct 2001 15:44:53 -0400 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/c-decl.c | 12 ++++++++++++ gcc/doc/extend.texi | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 532b7273a50..4387656675d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2001-10-08 DJ Delorie + + * 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 * aclocal.m4 (gcc_AC_PROG_GNAT): New. diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 4ec34eace4d..d167ddfd4c9 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 1ae858e93d4..be659203b15 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 -- 2.30.2