https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63226
--- Comment #5 from Tobias Burnus <burnus at gcc dot gnu.org> --- Created attachment 33478 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=33478&action=edit Second test file pair (1/2): one37.ii namespace std { template<typename _Arg, typename _Result> struct unary_function { }; } namespace mpl_ { } namespace mpl_ { template< bool C_ > struct bool_ { }; template< typename T, T N > struct integral_c; } namespace boost { namespace mpl { using ::mpl_::integral_c; } } namespace mpl_ { template< typename T, T N > struct integral_c { static const T value = N; }; } namespace boost{ template <class T, T val> struct integral_constant : public mpl::integral_c<T, val> { }; namespace detail { template <typename T> struct cv_traits_imp { typedef T unqualified_type; }; }; template< typename T > struct is_void : ::boost::integral_constant<bool,false> { }; template< typename T > struct is_integral : ::boost::integral_constant<bool,false> { }; namespace type_traits { template <typename T> struct is_mem_fun_pointer_impl { static const bool value = false; }; } template< typename T > struct remove_cv { typedef typename boost::detail::cv_traits_imp<T*>::unqualified_type type; }; template< typename T > struct is_member_function_pointer : ::boost::integral_constant<bool,::boost::type_traits::is_mem_fun_pointer_impl<typename remove_cv<T>::type>::value> { }; template< typename T > struct is_member_pointer : ::boost::integral_constant<bool,::boost::is_member_function_pointer<T>::value> { }; namespace type_traits { template <bool b1, bool b2, bool b3 = true, bool b4 = true, bool b5 = true, bool b6 = true, bool b7 = true> struct ice_and; template <bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7> struct ice_and { static const bool value = false; }; template <bool b> struct ice_not { static const bool value = true; }; } namespace detail { template< typename T > struct is_pointer_helper { static const bool value = false; }; template< typename T > struct is_pointer_impl { static const bool value = (::boost::type_traits::ice_and< ::boost::detail::is_pointer_helper<typename remove_cv<T>::type>::value , ::boost::type_traits::ice_not< ::boost::is_member_pointer<T>::value >::value >::value) ; }; } template< typename T > struct is_pointer : ::boost::integral_constant<bool,::boost::detail::is_pointer_impl<T>::value> { }; namespace mpl { template< bool C , typename T1 , typename T2 > struct if_c { }; template< typename T1 , typename T2 > struct if_c<false,T1,T2> { typedef T2 type; }; } template <bool B, class T = void> struct enable_if_c { typedef T type; }; template<typename Signature> class function; namespace detail { namespace function { union function_buffer { mutable void (*func_ptr)(); }; struct function_ptr_tag { }; template<typename F> class get_function_tag { typedef typename mpl::if_c<(is_pointer<F>::value), function_ptr_tag, function_ptr_tag>::type ptr_or_obj_tag; public: typedef ptr_or_obj_tag type; }; template<typename Functor> struct functor_manager { public: static inline void manage(const function_buffer& in_buffer, function_buffer& out_buffer) { } }; struct vtable_base { void (*manager)(const function_buffer& in_buffer, function_buffer& out_buffer); }; } } class function_base { }; namespace detail { namespace function { template< typename FunctionObj, typename R , typename T0 > struct function_obj_invoker1 { static R invoke(function_buffer& function_obj_ptr , T0 a0) { } }; template< typename FunctionObj, typename R , typename T0 > struct void_function_obj_invoker1 { }; template< typename FunctionObj, typename R , typename T0 > struct get_function_obj_invoker1 { typedef typename mpl::if_c<(is_void<R>::value), void_function_obj_invoker1< FunctionObj, R , T0 >, function_obj_invoker1< FunctionObj, R , T0 > >::type type; }; template<typename Tag> struct get_invoker1 { template<typename FunctionObj, typename R , typename T0> struct apply { typedef typename get_function_obj_invoker1< FunctionObj, R , T0 >::type invoker_type; typedef functor_manager<FunctionObj> manager_type; }; }; template<typename R , typename T0> struct basic_vtable1 { typedef R result_type; typedef result_type (*invoker_type)(function_buffer& , T0); vtable_base base; invoker_type invoker; }; } } template< typename R , typename T0 > class function1 : public function_base { typedef boost::detail::function::basic_vtable1< R , T0> vtable_type; public: template<typename Functor> function1(Functor f ,typename enable_if_c< (boost::type_traits::ice_not< (is_integral<Functor>::value)>::value), int>::type = 0 ) : function_base() { typedef typename detail::function::get_function_tag<Functor>::type tag; typedef detail::function::get_invoker1<tag> get_invoker; typedef typename get_invoker:: template apply<Functor, R , T0> handler_type; typedef typename handler_type::invoker_type invoker_type; typedef typename handler_type::manager_type manager_type; static vtable_type stored_vtable = { { &manager_type::manage } , &invoker_type::invoke }; } }; template<typename R , typename T0> class function<R ( T0)> : public function1<R , T0> { typedef function1<R , T0> base_type; public: template<typename Functor> function(Functor f ,typename enable_if_c< (boost::type_traits::ice_not< (is_integral<Functor>::value)>::value), int>::type = 0 ) : base_type(f) { } }; } typedef boost::function<void (const char*)> WarningHandler; class ParserImpl; class MyParser { ParserImpl* impl; public: MyParser (); }; class ParserImpl { public: ParserImpl (WarningHandler warner); }; static void DisplayWarning (const char* msg) { } MyParser::MyParser () { impl = new ParserImpl(DisplayWarning); }