From 550e28a1f1204533ca74afea95b51b3791151642 Mon Sep 17 00:00:00 2001
From: Akim Demaille <akim@lrde.epita.fr>
Date: Tue, 15 May 2012 11:22:34 +0200
Subject: [PATCH] build: do not prototype flex-generated functions.

Some versions of Flex, possibly modified by the distribution package
maintainers, have incompatible signatures.  Since newer versions of
Flex prototype their functions, avoid the conflicts in that case.
Reported by Stefano Lattarini.
<http://lists.gnu.org/archive/html/bug-bison/2012-05/msg00012.html>.

* src/flex-scanner.h (FLEX_VERSION_GT): New.
Use it to issue prototypes for flex-generated functions only for
versions up to 2.5.31, in accordance with the comment.
See commit dc9701e848f27ae64b6ddcf809580998667d60f2.
Use it to define yylex_destroy when needed.
---
 src/flex-scanner.h |   21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/src/flex-scanner.h b/src/flex-scanner.h
index 23a266a..ba83677 100644
--- a/src/flex-scanner.h
+++ b/src/flex-scanner.h
@@ -21,7 +21,20 @@
 # error "FLEX_PREFIX not defined"
 #endif
 
+/* Whether this version of Flex is (strictly) greater than
+   Major.Minor.Subminor.  */
+#define FLEX_VERSION_GT(Major, Minor, Subminor)                         \
+  (defined YY_FLEX_MAJOR_VERSION                                        \
+   && (Major < YY_FLEX_MAJOR_VERSION                                    \
+       || (Major == YY_FLEX_MAJOR_VERSION                               \
+           && (defined YY_FLEX_MINOR_VERSION                            \
+               && (Minor < YY_FLEX_MINOR_VERSION                        \
+                   || (Minor == YY_FLEX_MINOR_VERSION                   \
+                       && defined YY_FLEX_SUBMINOR_VERSION              \
+                       && Subminor < YY_FLEX_SUBMINOR_VERSION))))))
+
 /* Pacify "gcc -Wmissing-prototypes" when flex 2.5.31 is used.  */
+# if ! FLEX_VERSION_GT(2, 5, 31)
 int   FLEX_PREFIX (get_lineno) (void);
 FILE *FLEX_PREFIX (get_in) (void);
 FILE *FLEX_PREFIX (get_out) (void);
@@ -33,6 +46,7 @@ void  FLEX_PREFIX (set_out) (FILE *);
 int   FLEX_PREFIX (get_debug) (void);
 void  FLEX_PREFIX (set_debug) (int);
 int   FLEX_PREFIX (lex_destroy) (void);
+#endif
 
 #define last_string    FLEX_PREFIX (last_string)
 
@@ -51,12 +65,7 @@ int   FLEX_PREFIX (lex_destroy) (void);
    versions according to the Flex manual) leak memory if yylex_destroy is not
    invoked.  However, yylex_destroy is not defined before Flex 2.5.9, so give
    an implementation here that at least appears to work with Flex 2.5.4.  */
-#if !defined YY_FLEX_MAJOR_VERSION || YY_FLEX_MAJOR_VERSION < 2 \
-    || (YY_FLEX_MAJOR_VERSION == 2 \
-        && (!defined YY_FLEX_MINOR_VERSION || YY_FLEX_MINOR_VERSION < 5 \
-            || (YY_FLEX_MINOR_VERSION == 5 \
-                && (!defined YY_FLEX_SUBMINOR_VERSION \
-                    || YY_FLEX_SUBMINOR_VERSION < 9))))
+#if ! FLEX_VERSION_GT(2, 5, 9)
 # define yylex_destroy() yy_delete_buffer (YY_CURRENT_BUFFER)
 #endif
 
-- 
1.7.10.1

