https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121593
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Resolution|--- |INVALID Status|UNCONFIRMED |RESOLVED --- Comment #16 from Andrew Pinski <pinskia at gcc dot gnu.org> --- This is NOT a GCC bug. `char*` and `qchar8_t *` don't alias according to the C++ aliasing rules. So: auto* &i = reinterpret_cast<const qchar8_t *&>(it); and then incrrementing i will not work correctly. This is why -fno-strict-aliasing works. So the correct fix is: constexpr char32_t invalidValue = 0xFFFFFFFF; static_assert(invalidValue > QChar::LastValidCodePoint); const qchar8_t *i = (const qchar8_t *)it; const qchar8_t *e = (const qchar8_t *)end; const char32_t result = QUtf8Functions::nextCharacterFromUtf8(i, e, invalidValue); it = (const char *)i; end = (const char *)e; return result == invalidValue ? NextResult{U'\0', true} : NextResult{result, false};