https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67191
Markus Trippelsdorf <trippels at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2015-08-12 Ever confirmed|0 |1 --- Comment #1 from Markus Trippelsdorf <trippels at gcc dot gnu.org> --- trippels@gcc2-power8 tools % cat fwd_set_test.ii template <typename> class A; template <typename _Tp> using __allocator_base = _Tp; template <class T, class = T, class = int, class = __allocator_base<int>> class B; template <class T, class H, class P, class A> bool operator==(B<T, H, P, A> const &, B<T, H, P, A> const &); template <class T, class H, class P, class A> bool operator!=(B<T, H, P, A> const &, B<T, H, P, A> const &); typedef B<int> int_multiset; int a; template <typename> struct C { C(int) {} }; template <typename> struct D; template <typename> struct K; struct L : C<A<D<int>>>, C<A<K<int>>> { template <typename First, typename Second> L(First, Second) : C<A<D<int>>>(0), C<A<K<int>>>(0) {} }; template <typename Node> struct F { typedef typename Node::node_pointer node_pointer; node_pointer node_; F(); F(typename Node::link_pointer p1) : node_(static_cast<node_pointer>(p1)) {} void operator++() { node_ = 0; } int operator!=(F p1) { return node_ != p1.node_; } }; struct G { typedef G *link_pointer; }; struct H { static int new_bucket_count(int) { int b; int *c = 0; if (a) b = *c; return b; } }; class functions { public: functions(int, int) {} ~functions(); }; template <typename Types> struct table : functions { typedef typename Types::policy policy; typedef Types node_allocator; typedef F<typename Types::node> iterator; L allocators_; int bucket_count_; int size_; typename Types::link_pointer get_previous_start() const; iterator begin() const { return size_ ? get_previous_start() : 0; } table(int, typename Types::hasher, typename Types::key_equal, node_allocator) : functions(0, 0), allocators_(0, 0), bucket_count_(policy::new_bucket_count(0)), size_() {} }; template <typename> struct K : G { typedef K *node_pointer; }; struct I { typedef G *link_pointer; }; struct J { typedef I::link_pointer link_pointer; }; template <typename> struct D { typedef int hasher; typedef int key_equal; typedef K<int> node; typedef J::link_pointer link_pointer; typedef H policy; }; struct M : table<D<int>> { node_allocator grouped_table_impl_a; M(int, int) : table(0, 0, 0, grouped_table_impl_a) {} void equals(M const &) const { for (iterator d = begin(); d.node_;) { iterator e; group_equals(e); } } static int group_equals(iterator p1) { int f; iterator g; for (; g != p1; ++g) if (find()) if (f) return 0; } static int find(); }; template <class, class, class, class> class B { M table_; public: B(unsigned long = 0); friend bool operator==<>(B const &, B const &); friend bool operator!=<>(B const &, B const &); }; template <class T, class H, class P, class A> B<T, H, P, A>::B(unsigned long) : table_(0, 0) {} template <class T, class H, class P, class A> bool operator==(B<T, H, P, A> const &p1, B<T, H, P, A> const &p2) { p1.table_.equals(p2.table_); } template <class T, class H, class P, class A> bool operator!=(B<T, H, P, A> const &p1, B<T, H, P, A> const &p2) { p1.table_.equals(p2.table_); } void use_multiset_fwd_declared_function_typerun() { int_multiset x, y; x == y; x != y; } trippels@gcc2-power8 tools % g++ -O2 -c fwd_set_test.ii fwd_set_test.ii: In function ‘void use_multiset_fwd_declared_function_typerun()’: fwd_set_test.ii:111:6: internal compiler error: in before_dom_children, at tree-ssa-sccvn.c:4372 void use_multiset_fwd_declared_function_typerun() { ^