// { dg-do compile } template class intrusive_ptr { public: ~intrusive_ptr() { intrusive_ptr_release( px ); } T * px; }; template struct intrusive_base { friend void intrusive_ptr_release(T* ptr) { delete ptr; } }; struct section_info; struct file_info : intrusive_base { intrusive_ptr parent; intrusive_ptr switched_section; }; struct section_info : intrusive_base { intrusive_ptr parent; }; struct id_state { void * start_file(void); }; void * id_state::start_file(void) { intrusive_ptr parent; } struct id_generation_data : intrusive_base { void child_length() const {} }; void generate_id(id_generation_data& generation_data) { generation_data.child_length(); }