https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103690
Alex Coplan <acoplan at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |acoplan at gcc dot gnu.org --- Comment #4 from Alex Coplan <acoplan at gcc dot gnu.org> --- Here's a slightly cleaned up testcase which fails with the same options FWIW: typedef int *int_ptr; struct __normal_iterator { int *_M_current; __normal_iterator(const int_ptr &__i) : _M_current(__i) {} void foo() { __normal_iterator(_M_current - 1); } }; void deallocate(int *); struct vector { int *_M_start; int *_M_finish; __normal_iterator end() { return _M_finish; } int back() { __normal_iterator t = _M_finish; t.foo(); } void foo(); }; int *p1, *p2; int last, result; void vector::foo() { for (int i; i;) while (i) { __normal_iterator t1 = end(); int *p3, *__old_start = _M_start, *__new_finish; long __count = &last - __old_start; if (__count > 0) __builtin_memmove(&result, __old_start, __count); p1 = &result + __count; p2 = p1 + 1; __count = _M_finish - t1._M_current; if (__count) __builtin_memmove(p2, t1._M_current, __count); p3 = p2 + __count; __new_finish = p3; if (__old_start) deallocate(__old_start); _M_finish = __new_finish; back(); } } also confirmed on aarch64-linux-gnu.