From fd37eb057ed121b91756ec73da9185f9c16a9b28 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Sun, 29 Mar 2020 11:14:15 +0200 Subject: [PATCH] yysymbol_type_t: always assign an enumerator Currently we define enumerators only for symbols that have an identifier. That rules out tokens such as '+', and nonterminals such as foo-bar and foo.bar. As a consequence we are taking chances: the compiler might compile yysymbol_type_t as too small an integral type for some symbol codes. * data/skeletons/bison.m4 (b4_symbol_sid): Forge a unique symbol identifier for symbols that don't have an ID. --- data/skeletons/bison.m4 | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/data/skeletons/bison.m4 b/data/skeletons/bison.m4 index d54ea2b7..1bd30dd1 100644 --- a/data/skeletons/bison.m4 +++ b/data/skeletons/bison.m4 @@ -407,8 +407,10 @@ m4_define([_b4_symbol], # b4_symbol_sid(NUM) # ------------------ -# Build the symbol ID based for this symbol. Return empty -# if that would produce an invalid symbol. +# Build the symbol ID based for this symbol. It must always exist, +# otherwise some symbols might not be represented in the enum, which +# might be compiled into too small a type to contain all the symbol +# numbers. m4_define([b4_symbol_sid], [m4_case([$1], [-2], [[YYSYMBOL_YYEMPTY]], @@ -417,8 +419,9 @@ m4_define([b4_symbol_sid], [$accept], [[YYSYMBOL_YYACCEPT]], [error], [[YYSYMBOL_YYERROR]], [$undefined], [[YYSYMBOL_YYUNDEF]], - [m4_quote(b4_symbol_if([$1], [has_id], - [[YYSYMBOL_]]m4_quote(_b4_symbol([$1], [id]))))])])]) + [b4_symbol_if([$1], [has_id], + [[YYSYMBOL_]]m4_quote(_b4_symbol([$1], [id])), + [[YYSYMBOL_$1_][]m4_bpatsubst(m4_quote(_b4_symbol([$1], [tag])), [[^a-zA-Z_0-9]], [_])])])])]) # b4_symbol(NUM, FIELD)