summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2019-10-06 11:58:10 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2019-10-06 11:59:16 -0700
commit6373b90fc8f9ab2bfa19a107d44cfad3404faf20 (patch)
treecfbfcd4214d17bf0f8ae9142e715761e071d7436
parentbeceb2fa9382fd44816cae382dd12ffc6a210d5e (diff)
downloadbison-6373b90fc8f9ab2bfa19a107d44cfad3404faf20.tar.gz
Port better to C++ platforms
* data/skeletons/yacc.c (YYPTRDIFF_T, YYPTRDIFF_MAXIMUM): Default to long, not int. (yy_lac_stack_realloc, yy_lac, yytnamerr, yyparse): Avoid casts to YYPTRDIFF_T that were masking the problem.
-rw-r--r--TODO13
-rw-r--r--data/skeletons/yacc.c12
2 files changed, 10 insertions, 15 deletions
diff --git a/TODO b/TODO
index a5935029..f3f08ce1 100644
--- a/TODO
+++ b/TODO
@@ -107,15 +107,10 @@ name they have in gcc, clang, etc. Likewise for the complain_* series of
functions.
* Modernization
-Remove some casts made for old compilers, such as Clang++ 3.3 and 3.4 when
-compiling yacc.c code:
-
- YYPTRDIFF_T yysize = (YYPTRDIFF_T) (yyssp - yyss + 1);
-
- YYPTRDIFF_T yysize_old =
- *yytop == yytop_empty ? 0 : (YYPTRDIFF_T) (*yytop - *yybottom + 1);
-
- YYPTRDIFF_T yysize = (YYPTRDIFF_T) (yyesp - *yyes + 1);
+Fix data/skeletons/yacc.c so that it defines YYPTRDIFF_T properly for modern
+and older C++ compilers. Currently the code defaults to defining it to
+'long' for non-GCC compilers, but it should use the proper C++ magic to
+define it to the same type as the C ptrdiff_t type.
* Completion
Several features are not available in all the backends.
diff --git a/data/skeletons/yacc.c b/data/skeletons/yacc.c
index 5ef4289e..10708627 100644
--- a/data/skeletons/yacc.c
+++ b/data/skeletons/yacc.c
@@ -425,9 +425,9 @@ typedef short yytype_int16;
# include <stdint.h> /* INFRINGES ON USER NAME SPACE */
# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
# else
-# define YYPTRDIFF_T int
+# define YYPTRDIFF_T long
# include <limits.h> /* INFRINGES ON USER NAME SPACE */
-# define YYPTRDIFF_MAXIMUM INT_MAX
+# define YYPTRDIFF_MAXIMUM LONG_MAX
# endif
#endif
@@ -857,7 +857,7 @@ yy_lac_stack_realloc (YYPTRDIFF_T *yycapacity, YYPTRDIFF_T yyadd,
yy_state_num **yytop, yy_state_num *yytop_empty)
{
YYPTRDIFF_T yysize_old =
- *yytop == yytop_empty ? 0 : (YYPTRDIFF_T) (*yytop - *yybottom + 1);
+ *yytop == yytop_empty ? 0 : *yytop - *yybottom + 1;
YYPTRDIFF_T yysize_new = yysize_old + yyadd;
if (*yycapacity < yysize_new)
{
@@ -1024,7 +1024,7 @@ yy_lac (yy_state_num *yyesa, yy_state_num **yyes,
YYDPRINTF ((stderr, " R%d", yyrule - 1));
if (yyesp != yyes_prev)
{
- YYPTRDIFF_T yysize = (YYPTRDIFF_T) (yyesp - *yyes + 1);
+ YYPTRDIFF_T yysize = yyesp - *yyes + 1;
if (yylen < yysize)
{
yyesp -= yylen;
@@ -1155,7 +1155,7 @@ yytnamerr (char *yyres, const char *yystr)
}
if (yyres)
- return (YYPTRDIFF_T) (yystpcpy (yyres, yystr) - yyres);
+ return yystpcpy (yyres, yystr) - yyres;
else
return yystrlen (yystr);
}
@@ -1535,7 +1535,7 @@ yysetstate:
#else
{
/* Get the current used size of the three stacks, in elements. */
- YYPTRDIFF_T yysize = (YYPTRDIFF_T) (yyssp - yyss + 1);
+ YYPTRDIFF_T yysize = yyssp - yyss + 1;
# if defined yyoverflow
{