https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90132
--- Comment #2 from Martin Sebor <msebor at gcc dot gnu.org> --- I think the following test case reproduces what's going on in decNumber.c. Both GCC 8 and 9 issue the warning (IIRC, the warning was added in GCC 7 for writes but enhanced to reads in GCC 8). $ cat a.c && gcc -O3 -S -Wall -fdump-tree-optimized=/dev/stdout a.c struct S { int n, a[1]; }; static inline void f (int *d, const struct S *p) { const int *e = p->n > 1 ? p->a + p->n : p->a + 1; for (const int *s = p->a + 1; s < e; ++s, ++d) *d = *s; } void g (struct S*); void h (int *d) { struct S s = { 0 }; g (&s); f (d, &s); } ;; Function h (h, funcdef_no=1, decl_uid=1920, cgraph_uid=2, symbol_order=1) Removing basic block 6 Removing basic block 7 h (int * d) { struct S s; int _6; long unsigned int _7; long unsigned int _8; const int * iftmp.0_9; unsigned long _15; unsigned long _16; sizetype _20; unsigned long _23; sizetype _24; unsigned long _25; unsigned long _26; <bb 2> [local count: 118111600]: s = {}; g (&s); _6 = s.n; if (_6 > 1) goto <bb 3>; [59.00%] else goto <bb 5>; [41.00%] <bb 3> [local count: 69685844]: _7 = (long unsigned int) _6; _8 = _7 * 4; iftmp.0_9 = &s.a + _8; if (&MEM[(void *)&s + 8B] < iftmp.0_9) goto <bb 4>; [93.20%] else goto <bb 5>; [6.80%] <bb 4> [local count: 64949629]: _26 = (unsigned long) iftmp.0_9; _16 = (unsigned long) &MEM[(void *)&s + 8B]; _15 = ~_16; _23 = _15 + _26; _25 = _23 >> 2; _24 = _25 + 1; _20 = _24 * 4; __builtin_memcpy (d_4(D), &MEM[(void *)&s + 8B], _20); [tail call] <bb 5> [local count: 118111601]: s ={v} {CLOBBER}; return; } a.c: In function ‘h’: cc1: warning: ‘__builtin_memcpy’ reading 4 or more bytes from a region of size 0 [-Wstringop-overflow=]