https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113907
--- Comment #16 from Sam James <sjames at gcc dot gnu.org> --- (In reply to Jakub Jelinek from comment #14 > So it certainly doesn't surprise me some length < 8 check is optimized away > given the above range info. The question is if it is correct and what > values the length actually get at runtime if you e.g. compile with -O0. (gdb) b uprv_copyArray16 Breakpoint 1 at 0xf770e71b: file udataswp.cpp, line 147. (gdb) b uprv_copyArray64 Breakpoint 2 at 0xf770e7ba: file udataswp.cpp, line 164. (gdb) r Breakpoint 1, uprv_copyArray16 (ds=0x5655e4f0, inData=0xf32a4010, length=2, outData=0xf7f24094, pErrorCode=0xffffc47c) at udataswp.cpp:147 147 if(pErrorCode==nullptr || U_FAILURE(*pErrorCode)) { (gdb) c Continuing. Breakpoint 1, uprv_copyArray16 (ds=0x5655e4f0, inData=0xf32a4014, length=4, outData=0xf7f24098, pErrorCode=0xffffc47c) at udataswp.cpp:147 147 if(pErrorCode==nullptr || U_FAILURE(*pErrorCode)) { (gdb) c Continuing. [Inferior 1 (process 2861598) exited normally] (gdb) Oops.