On Mon, 2016-07-25 at 10:36 +0200, Richard Biener wrote: > On Fri, Jul 22, 2016 at 4:11 PM, Jakub Jelinek <ja...@redhat.com> > wrote: > > On Fri, Jul 22, 2016 at 10:33:50AM -0400, David Malcolm wrote: > > > gcc/cp/ChangeLog: > > > * parser.h (struct cp_token): Add a STATIC_ASSERT on the > > > size of the struct. > > > --- > > > gcc/cp/parser.h | 9 +++++++++ > > > 1 file changed, 9 insertions(+) > > > > > > diff --git a/gcc/cp/parser.h b/gcc/cp/parser.h > > > index ccbace9..8c1de57 100644 > > > --- a/gcc/cp/parser.h > > > +++ b/gcc/cp/parser.h > > > @@ -71,6 +71,15 @@ struct GTY (()) cp_token { > > > "|| (%1.type == CPP_DECLTYPE)"))) u; > > > }; > > > > > > +/* The C++ frontend lexes everything first, and keeps the tokens > > > + in memory, so there are possibly millions of tokens in > > > memory. > > > + Ensure that we don't accidentally grow the structure. */ > > > +STATIC_ASSERT (sizeof (cp_token) == > > > + (2 // "type" and "keyword" > > > + + 1 // "flags" > > > + + 1 // bitfields > > > + + 4 // location_t > > > + + sizeof (void *))); // union > > > > Doesn't that assume way too much on the host data layout? > > This can be compiled with weirdo system compilers or on weirdo > > hosts, > > I bet we don't really support non-8-bit char hosts, but still this > > might > > break somewhere... > > > > The formatting is wrong BTW, == shouldn't appear at the end of > > line. > > Maybe restrict it to __GNUC__ and __x86_64__ or so. > > Richard. > > > Jakub
Bootstrapped®rtested on x86_64-pc-linux-gnu (in conjunction with the followup patch) OK for trunk if it passes testing by itself? gcc/cp/ChangeLog: * parser.h (struct cp_token): Add a STATIC_ASSERT on the size of the struct. --- gcc/cp/parser.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/gcc/cp/parser.h b/gcc/cp/parser.h index 2923378..bc961c5 100644 --- a/gcc/cp/parser.h +++ b/gcc/cp/parser.h @@ -71,6 +71,23 @@ struct GTY (()) cp_token { "|| (%1.type == CPP_DECLTYPE)"))) u; }; +/* The C++ frontend lexes everything first, and keeps the tokens + in memory, so there are possibly millions of tokens in memory. + + Use a STATIC_ASSERT to ensure that we don't accidentally grow + the structure. + + To avoid introducing too many assumptions on the host data layout, + only enable the assertion when compiling with GCC for a + known-good host. */ +#if defined (__GNUC__) && defined (__x86_64__) +STATIC_ASSERT (sizeof (cp_token) == + (2 // "type" and "keyword" + + 1 // "flags" + + 1 // bitfields + + 4 // location_t + + sizeof (void *))); // union +#endif /* #if defined (__GNUC__) && defined (__x86_64__) */ /* We use a stack of token pointer for saving token sets. */ typedef struct cp_token *cp_token_position; -- 1.8.5.3