Buildfarm member anchovy has been failing for the last couple of days, evidently because its owner just couldn't wait to adopt bison 3.0, which is all of 3 days old. The failures look like
cubeparse.y:42.1-13: warning: deprecated directive, use '%name-prefix' [-Wdeprecated] %name-prefix="cube_yy" ^^^^^^^^^^^^^ (which looks like 3.0 isn't actually ready for prime time, but at least it's only a warning) cubeparse.c:163:5: error: conflicting types for 'cube_yyparse' int cube_yyparse (void); ^ cubeparse.y:32:5: note: previous declaration of 'cube_yyparse' was here int cube_yyparse(void *result); ^ A look in the Bison release notes explains this one: they stopped supporting YYPARSE_PARAM, which contrib/cube and contrib/seg both use. The recommended replacement is %parse-param, which is certainly a whole lot cleaner: it lets you specify the datatype of the extra parser parameter, instead of having it default to "void *". This option also changes the signature of yyerror(), but that's not a problem. At first I thought this was going to make us go through a tool upgrade exercise, because I couldn't find %parse-param in the documentation for bison 1.875, which is our oldest supported version. But further research shows that %parse-param actually was introduced in 1.875, they just forgot to document it :-(. So I propose the attached patch, which I've verified still works with 1.875. I don't plan to install 3.0 just to test this, but I assume it's OK there. I'm thinking we should apply this to all supported branches, in case somebody gets the idea to build an older branch with bleeding-edge tools. Any objections? regards, tom lane
diff --git a/contrib/cube/cube.c b/contrib/cube/cube.c index ce8eaa870fc760b7c7b4607e0844c38ffd5e56bb..dab0e6e7586e306ecfabb6537789a91f95d656e8 100644 *** a/contrib/cube/cube.c --- b/contrib/cube/cube.c *************** PG_MODULE_MAGIC; *** 26,33 **** #define ARRPTR(x) ( (double *) ARR_DATA_PTR(x) ) #define ARRNELEMS(x) ArrayGetNItems( ARR_NDIM(x), ARR_DIMS(x)) ! extern int cube_yyparse(); ! extern void cube_yyerror(const char *message); extern void cube_scanner_init(const char *str); extern void cube_scanner_finish(void); --- 26,33 ---- #define ARRPTR(x) ( (double *) ARR_DATA_PTR(x) ) #define ARRNELEMS(x) ArrayGetNItems( ARR_NDIM(x), ARR_DIMS(x)) ! extern int cube_yyparse(NDBOX **result); ! extern void cube_yyerror(NDBOX **result, const char *message); extern void cube_scanner_init(const char *str); extern void cube_scanner_finish(void); *************** Datum *** 156,167 **** cube_in(PG_FUNCTION_ARGS) { char *str = PG_GETARG_CSTRING(0); ! void *result; cube_scanner_init(str); if (cube_yyparse(&result) != 0) ! cube_yyerror("bogus input"); cube_scanner_finish(); --- 156,167 ---- cube_in(PG_FUNCTION_ARGS) { char *str = PG_GETARG_CSTRING(0); ! NDBOX *result; cube_scanner_init(str); if (cube_yyparse(&result) != 0) ! cube_yyerror(&result, "bogus input"); cube_scanner_finish(); diff --git a/contrib/cube/cubeparse.y b/contrib/cube/cubeparse.y index 21fe5378773da012bd223f4437f02d248da6b6c6..d7205b824cb5c0f21c913b5746552898d8590327 100644 *** a/contrib/cube/cubeparse.y --- b/contrib/cube/cubeparse.y *************** *** 1,10 **** %{ /* NdBox = [(lowerleft),(upperright)] */ /* [(xLL(1)...xLL(N)),(xUR(1)...xUR(n))] */ - /* contrib/cube/cubeparse.y */ - - #define YYPARSE_PARAM result /* need this to pass a pointer (void *) to yyparse */ #define YYSTYPE char * #define YYDEBUG 1 --- 1,9 ---- %{ + /* contrib/cube/cubeparse.y */ + /* NdBox = [(lowerleft),(upperright)] */ /* [(xLL(1)...xLL(N)),(xUR(1)...xUR(n))] */ #define YYSTYPE char * #define YYDEBUG 1 *************** extern int cube_yylex(void); *** 28,35 **** static char *scanbuf; static int scanbuflen; ! void cube_yyerror(const char *message); ! int cube_yyparse(void *result); static int delim_count(char *s, char delim); static NDBOX * write_box(unsigned int dim, char *str1, char *str2); --- 27,34 ---- static char *scanbuf; static int scanbuflen; ! extern int cube_yyparse(NDBOX **result); ! extern void cube_yyerror(NDBOX **result, const char *message); static int delim_count(char *s, char delim); static NDBOX * write_box(unsigned int dim, char *str1, char *str2); *************** static NDBOX * write_point_as_box(char * *** 38,43 **** --- 37,43 ---- %} /* BISON Declarations */ + %parse-param {NDBOX **result} %expect 0 %name-prefix="cube_yy" *************** box: O_BRACKET paren_list COMMA paren_li *** 70,76 **** YYABORT; } ! *((void **)result) = write_box( dim, $2, $4 ); } --- 70,76 ---- YYABORT; } ! *result = write_box( dim, $2, $4 ); } *************** box: O_BRACKET paren_list COMMA paren_li *** 97,103 **** YYABORT; } ! *((void **)result) = write_box( dim, $1, $3 ); } | paren_list --- 97,103 ---- YYABORT; } ! *result = write_box( dim, $1, $3 ); } | paren_list *************** box: O_BRACKET paren_list COMMA paren_li *** 114,120 **** YYABORT; } ! *((void **)result) = write_point_as_box($1, dim); } | list --- 114,120 ---- YYABORT; } ! *result = write_point_as_box($1, dim); } | list *************** box: O_BRACKET paren_list COMMA paren_li *** 130,136 **** CUBE_MAX_DIM))); YYABORT; } ! *((void **)result) = write_point_as_box($1, dim); } ; --- 130,136 ---- CUBE_MAX_DIM))); YYABORT; } ! *result = write_point_as_box($1, dim); } ; diff --git a/contrib/cube/cubescan.l b/contrib/cube/cubescan.l index 8f917cd33adc282ffba11c5d5f9d9703e6d025a0..e383b59d3d0d40f64d7432585e508a0f347f8dfd 100644 *** a/contrib/cube/cubescan.l --- b/contrib/cube/cubescan.l *************** float ({integer}|{real})([eE]{int *** 61,67 **** %% void __attribute__((noreturn)) ! yyerror(const char *message) { if (*yytext == YY_END_OF_BUFFER_CHAR) { --- 61,67 ---- %% void __attribute__((noreturn)) ! yyerror(NDBOX **result, const char *message) { if (*yytext == YY_END_OF_BUFFER_CHAR) { diff --git a/contrib/seg/seg.c b/contrib/seg/seg.c index 1c14c49fecab78e7f4da6be9f6e71489f371be6e..0cf9853060b4e127876cd6da267f93dcd0783009 100644 *** a/contrib/seg/seg.c --- b/contrib/seg/seg.c *************** *** 23,30 **** PG_MODULE_MAGIC; ! extern int seg_yyparse(); ! extern void seg_yyerror(const char *message); extern void seg_scanner_init(const char *str); extern void seg_scanner_finish(void); --- 23,30 ---- PG_MODULE_MAGIC; ! extern int seg_yyparse(SEG *result); ! extern void seg_yyerror(SEG *result, const char *message); extern void seg_scanner_init(const char *str); extern void seg_scanner_finish(void); *************** seg_in(PG_FUNCTION_ARGS) *** 126,132 **** seg_scanner_init(str); if (seg_yyparse(result) != 0) ! seg_yyerror("bogus input"); seg_scanner_finish(); --- 126,132 ---- seg_scanner_init(str); if (seg_yyparse(result) != 0) ! seg_yyerror(result, "bogus input"); seg_scanner_finish(); diff --git a/contrib/seg/segparse.y b/contrib/seg/segparse.y index e6a0bad59125e1bad3324502ef5e153c254c5381..3fad9910bd54d382368a352d466ea2c203aa99c8 100644 *** a/contrib/seg/segparse.y --- b/contrib/seg/segparse.y *************** *** 1,5 **** %{ ! #define YYPARSE_PARAM result /* need this to pass a pointer (void *) to yyparse */ #include "postgres.h" --- 1,5 ---- %{ ! /* contrib/seg/segparse.y */ #include "postgres.h" *************** extern int seg_yylex(void); *** 24,31 **** extern int significant_digits(char *str); /* defined in seg.c */ ! void seg_yyerror(const char *message); ! int seg_yyparse(void *result); static float seg_atof(char *value); --- 24,31 ---- extern int significant_digits(char *str); /* defined in seg.c */ ! extern int seg_yyparse(SEG *result); ! extern void seg_yyerror(SEG *result, const char *message); static float seg_atof(char *value); *************** static char strbuf[25] = { *** 40,45 **** --- 40,46 ---- %} /* BISON Declarations */ + %parse-param {SEG *result} %expect 0 %name-prefix="seg_yy" *************** static char strbuf[25] = { *** 65,123 **** range: boundary PLUMIN deviation { ! ((SEG *)result)->lower = $1.val - $3.val; ! ((SEG *)result)->upper = $1.val + $3.val; ! sprintf(strbuf, "%g", ((SEG *)result)->lower); ! ((SEG *)result)->l_sigd = Max(Min(6, significant_digits(strbuf)), Max($1.sigd, $3.sigd)); ! sprintf(strbuf, "%g", ((SEG *)result)->upper); ! ((SEG *)result)->u_sigd = Max(Min(6, significant_digits(strbuf)), Max($1.sigd, $3.sigd)); ! ((SEG *)result)->l_ext = '\0'; ! ((SEG *)result)->u_ext = '\0'; } | boundary RANGE boundary { ! ((SEG *)result)->lower = $1.val; ! ((SEG *)result)->upper = $3.val; ! if ( ((SEG *)result)->lower > ((SEG *)result)->upper ) { ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("swapped boundaries: %g is greater than %g", ! ((SEG *)result)->lower, ((SEG *)result)->upper))); YYERROR; } ! ((SEG *)result)->l_sigd = $1.sigd; ! ((SEG *)result)->u_sigd = $3.sigd; ! ((SEG *)result)->l_ext = ( $1.ext ? $1.ext : '\0' ); ! ((SEG *)result)->u_ext = ( $3.ext ? $3.ext : '\0' ); } | boundary RANGE { ! ((SEG *)result)->lower = $1.val; ! ((SEG *)result)->upper = HUGE_VAL; ! ((SEG *)result)->l_sigd = $1.sigd; ! ((SEG *)result)->u_sigd = 0; ! ((SEG *)result)->l_ext = ( $1.ext ? $1.ext : '\0' ); ! ((SEG *)result)->u_ext = '-'; } | RANGE boundary { ! ((SEG *)result)->lower = -HUGE_VAL; ! ((SEG *)result)->upper = $2.val; ! ((SEG *)result)->l_sigd = 0; ! ((SEG *)result)->u_sigd = $2.sigd; ! ((SEG *)result)->l_ext = '-'; ! ((SEG *)result)->u_ext = ( $2.ext ? $2.ext : '\0' ); } | boundary { ! ((SEG *)result)->lower = ((SEG *)result)->upper = $1.val; ! ((SEG *)result)->l_sigd = ((SEG *)result)->u_sigd = $1.sigd; ! ((SEG *)result)->l_ext = ((SEG *)result)->u_ext = ( $1.ext ? $1.ext : '\0' ); } ; --- 66,124 ---- range: boundary PLUMIN deviation { ! result->lower = $1.val - $3.val; ! result->upper = $1.val + $3.val; ! sprintf(strbuf, "%g", result->lower); ! result->l_sigd = Max(Min(6, significant_digits(strbuf)), Max($1.sigd, $3.sigd)); ! sprintf(strbuf, "%g", result->upper); ! result->u_sigd = Max(Min(6, significant_digits(strbuf)), Max($1.sigd, $3.sigd)); ! result->l_ext = '\0'; ! result->u_ext = '\0'; } | boundary RANGE boundary { ! result->lower = $1.val; ! result->upper = $3.val; ! if ( result->lower > result->upper ) { ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("swapped boundaries: %g is greater than %g", ! result->lower, result->upper))); YYERROR; } ! result->l_sigd = $1.sigd; ! result->u_sigd = $3.sigd; ! result->l_ext = ( $1.ext ? $1.ext : '\0' ); ! result->u_ext = ( $3.ext ? $3.ext : '\0' ); } | boundary RANGE { ! result->lower = $1.val; ! result->upper = HUGE_VAL; ! result->l_sigd = $1.sigd; ! result->u_sigd = 0; ! result->l_ext = ( $1.ext ? $1.ext : '\0' ); ! result->u_ext = '-'; } | RANGE boundary { ! result->lower = -HUGE_VAL; ! result->upper = $2.val; ! result->l_sigd = 0; ! result->u_sigd = $2.sigd; ! result->l_ext = '-'; ! result->u_ext = ( $2.ext ? $2.ext : '\0' ); } | boundary { ! result->lower = result->upper = $1.val; ! result->l_sigd = result->u_sigd = $1.sigd; ! result->l_ext = result->u_ext = ( $1.ext ? $1.ext : '\0' ); } ; diff --git a/contrib/seg/segscan.l b/contrib/seg/segscan.l index 95139f4631800f5ced1cb21ef24f7839ccb2b840..a3e685488a80706b80ca0a0d17df7b1a7393593d 100644 *** a/contrib/seg/segscan.l --- b/contrib/seg/segscan.l *************** float ({integer}|{real})([eE]{int *** 60,66 **** %% void __attribute__((noreturn)) ! yyerror(const char *message) { if (*yytext == YY_END_OF_BUFFER_CHAR) { --- 60,66 ---- %% void __attribute__((noreturn)) ! yyerror(SEG *result, const char *message) { if (*yytext == YY_END_OF_BUFFER_CHAR) {
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers