https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63244
--- Comment #6 from David Kredba <nheghathivhistha at gmail dot com> --- For the record only, git version of c-reduce returned namespace std { template <typename> struct less; template <typename> struct add_rvalue_reference; template <typename _Tp> typename add_rvalue_reference<_Tp>::type declval(); template <typename _Tp> struct __add_rvalue_reference_helper { typedef _Tp type; }; template <typename _Tp> struct add_rvalue_reference : __add_rvalue_reference_helper<_Tp> {}; } typedef int intptr_t; namespace std { template <typename> class allocator; template <typename _Tp, typename = allocator<_Tp> > class vector {}; } typedef intptr_t cl_context_properties; namespace clover { class device; } namespace std { template <typename _Key, typename = less<_Key> > class map; } namespace clover { template <typename> class intrusive_ref; struct derefs; namespace detail { template <typename, typename...> class iterator_adaptor; template <typename, typename, typename> class basic_range { public: template <typename V> operator V() const {} }; template <typename T> using preferred_iterator_type = decltype(std::declval<T>); } template <typename F, typename... Os> class adaptor_range : public detail::basic_range< adaptor_range<F>, detail::iterator_adaptor<F>, detail::iterator_adaptor< F, detail::preferred_iterator_type<Os>...> > {}; template <typename T> class ref_vector : public adaptor_range<derefs, std::vector<T> > {}; template <typename> class property_element; template <typename D> using property_list = std::map<property_element<D> >; class context { typedef clover::property_list<cl_context_properties> property_list; context(const property_list &, const ref_vector<device> &); std::vector<intrusive_ref<device> > devs; }; } using namespace clover; context::context(const property_list &, const ref_vector<device> &devs) : devs(devs) {}