This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: Traditional C chokes on struct/union initialization in new cpplex.c
- To: "Kaveh R. Ghazi" <ghazi at caip dot rutgers dot edu>
- Subject: Re: Traditional C chokes on struct/union initialization in new cpplex.c
- From: Jeffrey A Law <law at cygnus dot com>
- Date: Wed, 05 Jul 2000 18:40:39 -0600
- cc: zack at wolery dot cumb dot org, gcc-bugs at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Reply-To: law at cygnus dot com
In message <200007052059.QAA26992@caip.rutgers.edu>you write:
> Hi Zack,
>
> I had some trouble compiling the overhauled cpplex.c on sunos4
> using its K&R cc compiler. I get:
>
> > "../../egcs-CVS20000705/gcc/cpplex.c", line 1938: operands of = have
> > incompatible types
> > "../../egcs-CVS20000705/gcc/cpplex.c", line 1939: operands of = have
> > incompatible types
>
>
> The problem occurs on these two lines from cpplex.c:
>
> > static const cpp_token placemarker_token = {0, 0, CPP_PLACEMARKER, 0, {0
> }};
> > static const cpp_token eof_token = {0, 0, CPP_EOF, 0, {0}};
>
> Based on some experimentation, it appears to me that traditional C
> cannot initialize a union member of a struct. I tried getting it to
> work by playing with braces, etc., but no luck.
>
> If I take out the {0} entirely, then default initialization to zero
> works. However I still want to have the {0} appear for gcc so we
> don't get missing member initialization warnings.
>
> I hacked up this patch and got midway through stage2 so far. Assuming
> bootstrap succeeds, ok to install?
>
> --Kaveh
>
>
> 2000-07-05 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
>
> * cpplex.c (placemarker_token, eof_token): Don't initialize struct
> union member in traditional C.
The way this has been handled in BFD and elsewhere is to simply omit the
union initialization when ___STDC__.
See this change in BFD as an example.
1999-08-06 Ian Lance Taylor <ian@zembu.com>
* section.c (global_syms): Only initialize union field if
__STDC__.
Unless there is significant benefit, we should adopt the same conventions
as other GNU projects.
>
> diff -rup ../egcs-CVS20000705/gcc/cpplex.c egcs-CVS20000705/gcc/cpplex.c
> --- ../egcs-CVS20000705/gcc/cpplex.c Wed Jul 5 05:43:15 2000
> +++ egcs-CVS20000705/gcc/cpplex.c Wed Jul 5 16:05:21 2000
> @@ -1935,8 +1935,15 @@ spell_token (pfile, token, buffer)
>
> /* Macro expansion algorithm. TODO. */
>
> -static const cpp_token placemarker_token = {0, 0, CPP_PLACEMARKER, 0, {0}}
> ;
> -static const cpp_token eof_token = {0, 0, CPP_EOF, 0, {0}};
> +/* Traditional C cannot initialize union members of structs. */
> +#ifdef ANSI_PROTOTYPES
> +#define UNION_INIT , {0}
> +#else
> +#define UNION_INIT
> +#endif
> +
> +static const cpp_token placemarker_token = {0, 0, CPP_PLACEMARKER, 0 UNION
> _INIT};
> +static const cpp_token eof_token = {0, 0, CPP_EOF, 0 UNION_INIT};
>
> #define IS_ARG_CONTEXT(c) ((c)->flags & CONTEXT_ARG)
> #define CURRENT_CONTEXT(pfile) ((pfile)->contexts + (pfile)->cur_context)
>