This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch/rfc] Test struct0


On Wed, Feb 04, 2004 at 10:52:09AM -0500, Andrew Cagney wrote:
> >On Tue, Feb 03, 2004 at 07:06:47PM -0500, Andrew Cagney wrote:
> >
> >>Hello,
> >>
> >>This adds a test for:
> >>
> >>	struct foo0 { };
> >>
> >>to the structs.exp testcase (I'm assuming that this is legal ISO-C), it 
> >
> >
> >Nope.
> 
> I guess I misunderstood Jim's comments.
> http://sources.redhat.com/ml/gdb-patches/2004-01/msg00717.html

Hmm, the comment isn't very clear.  Yes, this is a GNU extension
(though not many people seem to know it).

> >      struct-or-union-specifier:
> >           struct-or-union identifier-opt { struct-declaration-list }
> >           struct-or-union identifier
> >
> >      struct-or-union:
> >           struct
> >           union
> >
> >      struct-declaration-list:
> >           struct-declaration
> >           struct-declaration-list struct-declaration
> >
> >      struct-declaration:
> >           specifier-qualifier-list struct-declarator-list ;
> >
> >So there must be a minimum of one declarator and trailing semicolon
> >inside the braces.  GCC will warn about this if you ask it to - it's
> >probably -ansi, or -std=c89 -ansi -pedantic.
> 
> >While it's not legal C, I believe that it is legal C++.
> 
> But are you sure?  :-)  If it's legal C++ then it, along with some other 
> wierd-o edge cases should probably be added to a gdb.cp/struct0 test 
> (someone with less rusty C++ than me can probably come up with a list).
> 
> Trying to include it in structs.exp would just be too messy.

Yeah.  Of course, there's the interesting property that zero-element
structures have non-zero size in C++.  That's because they're a
first-class part of the language.  Consider:

struct foo { };
struct foo bar[10];

int baz = sizeof (bar);

In GNU C, baz is initialized to zero.  In GNU C++ (i386-linux, but I
think all targets since the v3 ABI covers this), baz is initialized to
ten.  One byte per zero-sized struct is wasted in order to preserve
monotonically increasing array element addresses.  Then, in some cases
(all dealing with base classes), the one byte is optimized away again.

-- 
Daniel Jacobowitz
MontaVista Software                         Debian GNU/Linux Developer


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]