https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105223
Bug ID: 105223 Summary: [12 Regression] filter_memfn_lookup internal compiler error Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: mpolacek at gcc dot gnu.org Target Milestone: --- Started with r12-7714-g47da5198766256: commit 47da5198766256be658b4c321cecfd6039b0b91b Author: Jason Merrill <ja...@redhat.com> Date: Fri Feb 25 15:07:15 2022 -0400 c++: using lookup within class defn [PR104476] $ ./cc1plus -quiet ice.C ice.C: In instantiation of ‘ServiceReference< <template-parameter-1-1> >::ServiceReference(ServiceReferenceBase) [with <template-parameter-1-1> = int; ServiceReferenceBase = ServiceReferenceBase]’: ice.C:75:54: required from here ice.C:50:53: internal compiler error: Segmentation fault 50 | ServiceReference(ServiceReferenceBase) { operator=(0); } | ~~~~~~~~~^~~ 0x1773b61 crash_signal /home/mpolacek/src/gcc/gcc/toplev.cc:322 0xae557e tree_check(tree_node*, char const*, int, char const*, tree_code) /home/mpolacek/src/gcc/gcc/tree.h:3456 0xe17756 operator() /home/mpolacek/src/gcc/gcc/cp/pt.cc:16411 0xe1799d filter_memfn_lookup /home/mpolacek/src/gcc/gcc/cp/pt.cc:16417 0xe180ce tsubst_baselink /home/mpolacek/src/gcc/gcc/cp/pt.cc:16506 0xe32588 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) /home/mpolacek/src/gcc/gcc/cp/pt.cc:21028 0xe30427 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) /home/mpolacek/src/gcc/gcc/cp/pt.cc:20658 0xe2ae60 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) /home/mpolacek/src/gcc/gcc/cp/pt.cc:19473 0xe22d0e tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) /home/mpolacek/src/gcc/gcc/cp/pt.cc:18486 0xe25b2d tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) /home/mpolacek/src/gcc/gcc/cp/pt.cc:18815 0xe22a79 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) /home/mpolacek/src/gcc/gcc/cp/pt.cc:18458 0xe25b2d tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) /home/mpolacek/src/gcc/gcc/cp/pt.cc:18815 0xe49a1f instantiate_body /home/mpolacek/src/gcc/gcc/cp/pt.cc:26393 0xe4b3eb instantiate_decl(tree_node*, bool, bool) /home/mpolacek/src/gcc/gcc/cp/pt.cc:26685 0xe4b787 instantiate_pending_templates(int) /home/mpolacek/src/gcc/gcc/cp/pt.cc:26764 0xc4a2b6 c_parse_final_cleanups() /home/mpolacek/src/gcc/gcc/cp/decl2.cc:5113 0xf9f06d c_common_parse_file() /home/mpolacek/src/gcc/gcc/c-family/c-opts.cc:1262 $ cat ice.C namespace std { template <typename _Iterator> class reverse_iterator { public: typename _Iterator::pointer operator->(); }; template <typename _Iterator> bool operator!=(reverse_iterator<_Iterator>, reverse_iterator<_Iterator>); } // namespace std template <typename _Iterator> class __normal_iterator { public: typedef _Iterator pointer; }; namespace std { template <typename> class allocator; template <typename> struct allocator_traits; template <typename _Tp> struct allocator_traits<allocator<_Tp>> { using pointer = _Tp *; }; } // namespace std class ServiceRegistrationBase; struct __alloc_traits : std::allocator_traits<std::allocator<ServiceRegistrationBase>> {}; namespace std { class __shared_ptr { public: using element_type = int; element_type *get(); }; struct _Vector_base { typedef __alloc_traits::pointer pointer; }; class vector { public: typedef std::reverse_iterator<__normal_iterator<_Vector_base::pointer>> reverse_iterator; reverse_iterator rbegin(); reverse_iterator rend(); }; template <typename> struct atomic; template <typename _Tp> struct atomic<_Tp *> { _Tp *load(); }; } // namespace std class ServiceReferenceBasePrivate; class ServiceReferenceBase { public: void operator=(decltype(nullptr)); std::atomic<ServiceReferenceBasePrivate *> d; }; template <class> class ServiceReference : public ServiceReferenceBase { public: ServiceReference(ServiceReferenceBase) { operator=(0); } using ServiceReferenceBase::operator=; }; class Bundle { friend std::__shared_ptr GetPrivate(Bundle); }; class ServiceRegistrationBase { public: ServiceReferenceBase GetReference(); }; class BundleContext { public: Bundle GetBundle(); }; class ServiceReferenceBasePrivate { public: std::__shared_ptr GetService(int *); }; void ServiceHooksFilterServiceEventReceivers() { BundleContext __trans_tmp_3; std::vector eventListenerHooks; auto selfBundle = __trans_tmp_3.GetBundle(); for (auto sriIter = eventListenerHooks.rbegin(), sriEnd = eventListenerHooks.rend(); sriIter != sriEnd;) { ServiceReference<int> sr = sriIter->GetReference(); int __trans_tmp_2 = *GetPrivate(selfBundle).get(); std::__shared_ptr __trans_tmp_1 = sr.d.load()->GetService(&__trans_tmp_2), elh(__trans_tmp_1); } }