// { dg-options "-std=c++0x" } struct int_placeholder; template struct do_replace { typedef T type; }; template<> struct do_replace { typedef int type; }; template struct lambdalike { typedef T type; }; template class TT, typename... Args> struct lambdalike > { typedef TT::type...> type; }; template struct is_same { static const bool value = false; }; template struct is_same { static const bool value = true; }; template struct tuple; template struct pair; static_assert(is_same>::type, tuple>::value, "MPL lambda-like replacement on tuple"); static_assert(is_same>::type, pair>::value, "MPL lambda-like replacement on pair"); struct _1 {}; template struct eval { typedef Lambda type; }; template struct eval { typedef Arg0 type; }; template class T, typename... Pack> struct eval > { typedef T< typename eval::type... > type; }; static_assert(is_same>::type, tuple>::value, "eval tuple"); static_assert(is_same>::type, pair>::value, "eval pair"); static_assert(is_same, pair, pair>>::type, tuple, pair, pair>>::value, "recursive eval");