On Mon, 2 Oct 2006, Tom Lane wrote:
> Jeremy Drake <pgsql@jdrake.com> writes:
> > The errors I got on this file were:
> > 1>bootparse.tab.c(1065) : error C2449: found '{' at file scope (missing function header?)
>
> I looked at this. Line 1065 is the left brace starting yyparse(). On
> my Fedora Core 5 box with Bison 2.1 installed, the stuff leading up to
> it is
>
> #ifdef YYPARSE_PARAM
> ... some uninteresting stuff, since we don't define YYPARSE_PARAM ...
> #else /* ! YYPARSE_PARAM */
> #if defined (__STDC__) || defined (__cplusplus)
> int
> yyparse (void)
> #else
> int
> yyparse ()
>
> #endif
> #endif
> {
>
> But lookee here, your Windows-built version has
>
> #ifdef YYPARSE_PARAM
> ...
> #else /* ! YYPARSE_PARAM */
> #if defined (__STDC__) || defined (__cplusplus)
> int
> yyparse (void)
> #else
> int
> yyparse ()
> ;
> #endif
> #endif
> {
>
> So that semicolon is the source of the trouble. That's clearly a bison
> bug, and in fact digging in Red Hat's SRPM shows that they are carrying
> a patch for it:
>
> 2005-10-05 Paul Eggert <eggert@cs.ucla.edu>
>
> * data/m4sugar/m4sugar.m4 (_m4_map): New macro.
> (m4_map, m4_map_sep): Use it. Handle the empty list correctly.
>
<snip patch>
>
> Presumably bison 2.2 includes this fix. But I guess the real question
> is why the devil doesn't MSVC define __STDC__ ? Are they that far
> removed from spec compliance?
In the bison 2.2 generated code, the #if check is
#if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER)
which looks like they figured out that they needed to check for MicroSoft
C explicitly. I have no idea why they do not define __STDC__ however.
>
> regards, tom lane
--
A person is just about as big as the things that make him angry.