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 https://github.com/coreutils/gnulib/commit/252b52457da7887667c036d18cc5169777615bb0) 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:
@@ -930,26 +930,30 @@ init_word_char (re_dfa_t *dfa)
|
|||||||
int ch = 0;
|
int ch = 0;
|
||||||
if (BE (dfa->map_notascii == 0, 1))
|
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"
|
/* Pacify gcc -Woverflow on 32-bit platformns. */
|
||||||
warnings in the case when this is dead code, i.e. 32-bit. */
|
dfa->word_char[0] = bits1 << 31 << 1 | bits0;
|
||||||
const uint64_t wc0 = UINT64_C (0x03ff000000000000);
|
dfa->word_char[1] = bits3 << 31 << 1 | bits2;
|
||||||
const uint64_t wc1 = UINT64_C (0x07fffffe87fffffe);
|
|
||||||
dfa->word_char[0] = wc0;
|
|
||||||
dfa->word_char[1] = wc1;
|
|
||||||
i = 2;
|
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[0] = bits0;
|
||||||
dfa->word_char[1] = UINT32_C (0x03ff0000);
|
dfa->word_char[1] = bits1;
|
||||||
dfa->word_char[2] = UINT32_C (0x87fffffe);
|
dfa->word_char[2] = bits2;
|
||||||
dfa->word_char[3] = UINT32_C (0x07fffffe);
|
dfa->word_char[3] = bits3;
|
||||||
i = 4;
|
i = 4;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
abort ();
|
goto general_case;
|
||||||
ch = 128;
|
ch = 128;
|
||||||
|
|
||||||
if (BE (dfa->is_utf8, 1))
|
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 (; i < BITSET_WORDS; ++i)
|
||||||
for (int j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
|
for (int j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
|
||||||
if (isalnum (ch) || ch == '_')
|
if (isalnum (ch) || ch == '_')
|
||||||
|
|||||||
Reference in New Issue
Block a user