This fixes some fun type size truncation that shows up giving errors like

" changes value from '287948901175001088' to '0' "

.. which turns out is a known issue with later gcc's.

eg - https://lists.gnu.org/archive/html/bug-gnulib/2012-03/msg00154.html

It was fixed up upstream corelib/gnulib in commit hash
252b52457da7887667c036d18cc5169777615bb0
(eg in 252b52457d)

TEST PLAN
  - compiled/run for gcc-6.4 on amd64

Reviewed by:	imp
Differential Revision:	https://reviews.freebsd.org/D26804
This commit is contained in:
Adrian Chadd 2020-10-16 14:28:13 +00:00
parent 3c2af8a31f
commit d00afbaea9
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=366765

View File

@ -930,26 +930,30 @@ init_word_char (re_dfa_t *dfa)
int ch = 0;
if (BE (dfa->map_notascii == 0, 1))
{
if (sizeof (dfa->word_char[0]) == 8)
/* Avoid uint32_t and uint64_t as some non-GCC platforms lack
them, an issue when this code is used in Gnulib. */
bitset_word_t bits0 = 0x00000000;
bitset_word_t bits1 = 0x03ff0000;
bitset_word_t bits2 = 0x87fffffe;
bitset_word_t bits3 = 0x07fffffe;
if (BITSET_WORD_BITS == 64)
{
/* The extra temporaries here avoid "implicitly truncated"
warnings in the case when this is dead code, i.e. 32-bit. */
const uint64_t wc0 = UINT64_C (0x03ff000000000000);
const uint64_t wc1 = UINT64_C (0x07fffffe87fffffe);
dfa->word_char[0] = wc0;
dfa->word_char[1] = wc1;
/* Pacify gcc -Woverflow on 32-bit platformns. */
dfa->word_char[0] = bits1 << 31 << 1 | bits0;
dfa->word_char[1] = bits3 << 31 << 1 | bits2;
i = 2;
}
else if (sizeof (dfa->word_char[0]) == 4)
else if (BITSET_WORD_BITS == 32)
{
dfa->word_char[0] = UINT32_C (0x00000000);
dfa->word_char[1] = UINT32_C (0x03ff0000);
dfa->word_char[2] = UINT32_C (0x87fffffe);
dfa->word_char[3] = UINT32_C (0x07fffffe);
dfa->word_char[0] = bits0;
dfa->word_char[1] = bits1;
dfa->word_char[2] = bits2;
dfa->word_char[3] = bits3;
i = 4;
}
else
abort ();
goto general_case;
ch = 128;
if (BE (dfa->is_utf8, 1))
@ -959,6 +963,7 @@ init_word_char (re_dfa_t *dfa)
}
}
general_case:
for (; i < BITSET_WORDS; ++i)
for (int j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
if (isalnum (ch) || ch == '_')