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.

Reply via email to