bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: AIX with Visual Age C compiler fails to compile 2.1 and later


From: Paul Eggert
Subject: Re: AIX with Visual Age C compiler fails to compile 2.1 and later
Date: Mon, 10 Oct 2005 22:42:15 -0700
User-agent: Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux)

"John P. Hartmann" <address@hidden> writes:

> CC=xlc make bison build, but I see a couple of problems in compiling:
>
> "scan-gram.c", line 2332.49: 1506-010 (E) Macro gram_wrap invoked with a null
> argument for parameter n.

Thanks for reporting all these problems.

This first diagnostic is due to a bug in the flex version we used to
generate Bison 2.1; see
<http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.
I assume the workaround at the end of this message will fix things for you.

> The calc++ example generates massive amounts of ld warnings about duplicate
> symbols and a couple of errors. 
>
> Here are the first few warnings.
>
> xlC_r  -g   -o calc++  calc++-scanner.o calc++.o calc++-driver.o
> calc++-parser.o
> ld: 0711-224 WARNING: Duplicate symbol: .std::basic_string
> <char,std::char_traits<char>,std::allocator<char> >::basic_string(const char*)

I don't know what a warning like that means.  Perhaps a C++ expert
can comment.  If they're just warnings I guess we can live with them
until someone can tell us how to fix them.

> ld: 0711-317 ERROR: Undefined symbol: yy::position::initial_line
> ld: 0711-317 ERROR: Undefined symbol: yy::position::initial_column

This sounds like some sort of C++ incompatibility.  The simplest fix
is to remove those symbols.  I installed the following patch in an
attempt to accomplish this.  Perhaps a C++ expert could do better.

>     However it is frustrating that Bison generates a parser that
>     compiles with prototypes disabled, even though the compiler
>     presumably supports prototypes well.  If you can suggest a
>     better approach (maybe 'cc' supports another predefined macro?)
>     I'm all ears.

I looked at the IBM documentation, and it seems to claim that cc
defines __STDC_VERSION__.  It can't hurt to check for that as well,
so I installed the following patch.

Does this patch fix your problems?

2005-10-10  Paul Eggert  <address@hidden>

        Work around portability problems with Visual Age C compiler
        (xlc and xlC_r) reported by John P. Hartmann.
        * data/location.cc (initial_column, initial_line): Remove.
        All uses replaced by 0 and 1.
        * src/scan-gram.l (gram_wrap): Redefine to avoid bug in flex 2.5.31
        that xlc complains about.
        * src/scan-skel.l (skel_wrap): Likewise.
        * data/c.m4 (b4_c_function_def): Look at __STDC_VERSION__ as well
        as __STDC__, as IBM cc defines the former but not the latter.
        * data/yacc.c (YYMODERN_C): New macro, which also looks at
        __STDC_VERSION__.  Use it everywhere instead of looking at
        __STDC__ and __cplusplus.

--- data/location.cc    2 Oct 2005 18:17:23 -0000       1.1
+++ data/location.cc    11 Oct 2005 05:05:44 -0000
@@ -43,20 +43,14 @@ namespace yy
   /// Abstract a position.
   class position
   {
-  public:
-    /// Initial column number.
-    static const unsigned int initial_column = 0;
-    /// Initial line number.
-    static const unsigned int initial_line = 1;
-
     /** \name Ctor & dtor.
      ** \{ */
   public:
     /// Construct a position.
     position () :
       filename (0),
-      line (initial_line),
-      column (initial_column)
+      line (1),
+      column (0)
     {
     }
     /** \} */
@@ -68,19 +62,19 @@ namespace yy
     /// (line related) Advance to the COUNT next lines.
     inline void lines (int count = 1)
     {
-      column = initial_column;
+      column = 0;
       line += count;
     }
 
     /// (column related) Advance to the COUNT next columns.
     inline void columns (int count = 1)
     {
-      int leftmost = initial_column;
+      int leftmost = 0;
       int current  = column;
       if (leftmost <= current + count)
        column += count;
       else
-       column = initial_column;
+       column = 0;
     }
     /** \} */
 
--- src/scan-gram.l     2 Oct 2005 18:49:15 -0000       1.76
+++ src/scan-gram.l     11 Oct 2005 05:05:44 -0000
@@ -24,6 +24,11 @@
 %option prefix="gram_" outfile="lex.yy.c"
 
 %{
+/* Work around a bug in flex 2.5.31.  See Debian bug 333231
+   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
+#undef gram_wrap
+#define gram_wrap() 1
+
 #include "system.h"
 
 #include <mbswidth.h>
--- src/scan-skel.l     2 Oct 2005 17:44:49 -0000       1.34
+++ src/scan-skel.l     11 Oct 2005 05:05:44 -0000
@@ -23,6 +23,11 @@
 %option prefix="skel_" outfile="lex.yy.c"
 
 %{
+/* Work around a bug in flex 2.5.31.  See Debian bug 333231
+   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
+#undef skel_wrap
+#define skel_wrap() 1
+
 #include "system.h"
 
 #include <error.h>
--- data/c.m4   6 Oct 2005 07:17:21 -0000       1.36
+++ data/c.m4   11 Oct 2005 05:32:15 -0000
@@ -232,7 +232,7 @@ m4_define([b4_token_enums_defines],
 # ----------------------------------------------------------
 # Declare the function NAME.
 m4_define([b4_c_function_def],
-[#if defined (__STDC__) || defined (__cplusplus)
+[#if defined (__STDC__) || defined (__STDC_VERSION__) || defined (__cplusplus)
 b4_c_ansi_function_def($@)
 #else
 $2
--- data/yacc.c 6 Oct 2005 07:17:21 -0000       1.113
+++ data/yacc.c 11 Oct 2005 05:32:15 -0000
@@ -219,12 +219,23 @@ typedef struct YYLTYPE
 /* Line __line__ of yacc.c.  */
 b4_syncline(address@hidden@], address@hidden@])[
 
+/* Define YYMODERN_C if this compiler supports C89 or better.  Some
+   modern compilers (e.g., IBM xlc 7.0) don't define __STDC__ for
+   pedantic reasons, but they define __STDC_VERSION__ so check that
+   as well.  Consider a C++ compiler to be modern if it defines
+   __cplusplus.  */
+#if defined (__STDC__) || defined (__STDC_VERSION__) || defined (__cplusplus)
+# define YYMODERN_C 1
+#else
+# define YYMODERN_C 0
+#endif
+
 #ifndef YYSIZE_T
 # if defined (__SIZE_TYPE__)
 #  define YYSIZE_T __SIZE_TYPE__
 # elif defined (size_t)
 #  define YYSIZE_T size_t
-# elif ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus))
+# elif ! defined (YYSIZE_T) && YYMODERN_C
 #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
 #  define YYSIZE_T size_t
 # else
@@ -266,8 +277,7 @@ b4_syncline(address@hidden@], address@hidden@])[
 #    define alloca _alloca
 #   else
 #    define YYSTACK_ALLOC alloca
-#    if (! defined (_ALLOCA_H) && ! defined (_STDLIB_H) \
-        && (defined (__STDC__) || defined (__cplusplus)))
+#    if ! defined (_ALLOCA_H) && ! defined (_STDLIB_H) && YYMODERN_C
 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
 #     ifndef _STDLIB_H
 #      define _STDLIB_H 1
@@ -298,15 +308,13 @@ extern "C" {
 #  endif
 #  ifndef YYMALLOC
 #   define YYMALLOC malloc
-#   if (! defined (malloc) && ! defined (_STDLIB_H) \
-       && (defined (__STDC__) || defined (__cplusplus)))
+#   if ! defined (malloc) && ! defined (_STDLIB_H) && YYMODERN_C
 void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
 #  ifndef YYFREE
 #   define YYFREE free
-#   if (! defined (free) && ! defined (_STDLIB_H) \
-       && (defined (__STDC__) || defined (__cplusplus)))
+#   if ! defined (free) && ! defined (_STDLIB_H)  && YYMODERN_C
 void free (void *); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
@@ -380,7 +388,7 @@ union yyalloc
 
 #endif
 
-#if defined (__STDC__) || defined (__cplusplus)
+#if YYMODERN_C
    typedef signed char yysigned_char;
 #else
    typedef short int yysigned_char;
@@ -711,7 +719,7 @@ int yydebug;
 #  else
 /* Return the length of YYSTR.  */
 static YYSIZE_T
-#   if defined (__STDC__) || defined (__cplusplus)
+#   if YYMODERN_C
 yystrlen (const char *yystr)
 #   else
 yystrlen (yystr)
@@ -735,7 +743,7 @@ yystrlen (yystr)
 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
    YYDEST.  */
 static char *
-#   if defined (__STDC__) || defined (__cplusplus)
+#   if YYMODERN_C
 yystpcpy (char *yydest, const char *yysrc)
 #   else
 yystpcpy (yydest, yysrc)
@@ -921,7 +929,7 @@ yysyntax_error (char *yyresult, int yyst
 /* Prevent warnings from -Wmissing-prototypes.  */
 
 #ifdef YYPARSE_PARAM
-# if defined (__STDC__) || defined (__cplusplus)
+# if YYMODERN_C
 int yyparse (void *YYPARSE_PARAM);
 # else
 int yyparse ();
@@ -959,7 +967,7 @@ b4_pure_if([],
 `----------*/
 
 #ifdef YYPARSE_PARAM
-# if defined (__STDC__) || defined (__cplusplus)
+# if YYMODERN_C
 int yyparse (void *YYPARSE_PARAM)
 # else
 int yyparse (YYPARSE_PARAM)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]