/* PR middle-end/100574 - ICE: in size_remaining, at builtins.c:413 with
   -O3 -ftracer -fno-tree-dominator-opts -fno-tree-fre
   { dg-do compile { target c++11 } }
   { dg-options "-O3 -ftracer -fno-tree-dominator-opts -fno-tree-fre" } */

void *operator new (__SIZE_TYPE__, void *__p) { return __p; }

template <typename> struct allocator_traits;
template <typename> class allocator {};
template <typename _Tp> struct allocator_traits<allocator<_Tp> >
{
  using allocator_type = allocator<_Tp>;
  using pointer = _Tp *;
  using size_type = long;
  template <typename _Up> using rebind_alloc = allocator<_Up>;
  static pointer allocate(allocator_type, size_type);
  template <typename _Up> static void construct(_Up __p) { new (__p) _Up(); }
};

struct __alloc_traits : allocator_traits<allocator<char>> {
  struct rebind {
    typedef rebind_alloc<char> other;
  };
};

struct _Vector_base {
  struct : __alloc_traits::rebind::other {
  } _M_impl;
  long _M_allocate___n;
};

template <typename, typename = char> class vector : _Vector_base {
  long max_size();
public:
  void push_back() { _M_realloc_insert(); }
  template <typename...> void _M_realloc_insert();
};

template <typename _Tp, typename _Alloc>
template <typename...>
void vector<_Tp, _Alloc>::_M_realloc_insert() {
  __alloc_traits::pointer __trans_tmp_5;
  /* __len is used uninitialized below, which might trigger warnings,
     even without -Wall (and other than -Wuninitialized).  */
  long __len(__len || max_size()), __elems_before;
  __trans_tmp_5 = _M_allocate___n
    ? __alloc_traits::allocate(_M_impl, _M_allocate___n)
    : __alloc_traits::pointer();
  __alloc_traits::construct(__trans_tmp_5 + __elems_before);
}

enum { MIDIST_PITCHBEND };
struct DataBlock {
  vector<char> data;
};

char ReadTrackChunk_status;

void ReadTrackChunk()
{
  DataBlock block;
  while (!0)
    switch (ReadTrackChunk_status)
    case MIDIST_PITCHBEND:
      block.data.push_back();
}

// { dg-prune-output "warning" }
