// { dg-do run  }
// prms-id: 12306

void *ptr1, *ptr2;
int fail = 0;

extern "C" int printf(const char *...);

class RWSlist { };

class RWSlistIterator {
public:
  RWSlist *slist;
  RWSlistIterator(RWSlist& s) { } 
  void toLast() {
    if (ptr1 != (RWSlistIterator*)this)
      fail = 5;
    if (ptr2 != &(*this).slist)
      fail = 6;

    if (0) printf("at %x %x\n", (RWSlistIterator*)this, &(*this).slist);
  }
};

class RWCollectable {
};

class RWSlistCollectables : public RWSlist {
public:	 
  RWSlistCollectables() { }
  RWSlistCollectables(RWCollectable* a) { }
};

class RWIterator { };	  

class RWSlistCollectablesIterator : public RWIterator, public RWSlistIterator {
public:
  RWSlistCollectablesIterator(RWSlistCollectables& s) : RWSlistIterator(s) { } 
};

class Sim_Event_Manager {
public:
  RWSlistCollectables scheduled_events_;
  RWSlistCollectablesIterator last_posted_event_position_;
  Sim_Event_Manager();
  void post_event();
};

Sim_Event_Manager::Sim_Event_Manager ()
  :last_posted_event_position_(scheduled_events_)
{
}

void Sim_Event_Manager::post_event () {
  ptr1 = (RWSlistIterator*)&last_posted_event_position_;
  ptr2 = &((RWSlistIterator*)&last_posted_event_position_)->slist;
  if (0) printf("at %x %x\n", (RWSlistIterator*)&last_posted_event_position_,
		&((RWSlistIterator*)&last_posted_event_position_)->slist);
  if (ptr1 != (RWSlistIterator*)&last_posted_event_position_)
    fail = 1;
  if (ptr2 != &((RWSlistIterator&)last_posted_event_position_).slist)
    fail = 2;
  if (0) printf("at %x ?%x\n", (RWSlistIterator*)&last_posted_event_position_,
		&((RWSlistIterator&)last_posted_event_position_).slist);
  if (ptr1 != (RWSlistIterator*)&last_posted_event_position_)
    fail = 3;
  if (ptr2 != &((RWSlistIterator&)last_posted_event_position_).slist)
    fail = 4;
  last_posted_event_position_.toLast();
}

int main(int argc, char **argv) {
  Sim_Event_Manager foo;
  foo.post_event();
  return fail;
}
