| // { dg-do compile } |
| // { dg-additional-options "-Wno-return-type" } |
| |
| template <typename> struct remove_reference; |
| template <typename _Tp> struct remove_reference<_Tp &> { typedef _Tp type; }; |
| template <typename _Tp> typename remove_reference<_Tp>::type move(_Tp &&p1) { |
| return static_cast<typename remove_reference<_Tp>::type &&>(p1); |
| } |
| void *operator new(__SIZE_TYPE__, void *p2) { return p2; } |
| struct Trans_NS__v1_GenericTlv { |
| virtual int getMinimumValueLength(); |
| virtual unsigned long getValueLength() const; |
| }; |
| struct IPv4NeighborAddressSubTlv; |
| struct Trans_NS__v1_GenericTlvBase : Trans_NS__v1_GenericTlv { |
| virtual bool operator==(const IPv4NeighborAddressSubTlv &) const; |
| }; |
| struct Trans_NS__v1_GenericUnsupportedTlv; |
| template <typename> struct backup_holder { |
| Trans_NS__v1_GenericUnsupportedTlv *backup_; |
| Trans_NS__v1_GenericUnsupportedTlv &get() { return *backup_; } |
| }; |
| template <typename> struct make_reference_content { |
| typedef IPv4NeighborAddressSubTlv type; |
| }; |
| template <typename> struct unwrap_recursive { |
| typedef IPv4NeighborAddressSubTlv type; |
| }; |
| template <typename> struct begin_impl; |
| template <typename Sequence> struct begin { |
| typedef typename Sequence::tag tag_; |
| typedef typename begin_impl<tag_>::template apply<Sequence>::type type; |
| }; |
| struct long_ { |
| static const int value = 0; |
| }; |
| template <typename> struct O1_size_impl; |
| template <typename Sequence> |
| struct O1_size |
| : O1_size_impl<typename Sequence::tag>::template apply<Sequence> {}; |
| template <typename F, typename T2> |
| struct apply_wrap2 : F::template apply<int, T2> {}; |
| template <int, typename, typename> struct iter_fold_impl; |
| template <typename First, typename ForwardOp> |
| struct iter_fold_impl<0, First, ForwardOp> { |
| typedef typename apply_wrap2<ForwardOp, First>::type state; |
| }; |
| template <typename Sequence, typename ForwardOp> struct iter_fold { |
| typedef |
| typename iter_fold_impl<O1_size<Sequence>::value, |
| typename begin<Sequence>::type, ForwardOp>::state |
| type; |
| }; |
| template <typename> struct deref; |
| template <typename T1> struct pair { typedef T1 first; }; |
| struct make_initializer_node { |
| template <typename, typename Iterator> struct apply { |
| struct initializer_node { |
| typedef typename deref<Iterator>::type recursive_enabled_T; |
| static int |
| initialize(void *p1, |
| typename unwrap_recursive<recursive_enabled_T>::type) { |
| new (p1) typename make_reference_content<recursive_enabled_T>::type; |
| } |
| }; |
| typedef pair<initializer_node> type; |
| }; |
| }; |
| struct l_item { |
| typedef int tag; |
| typedef l_item type; |
| typedef long_ size; |
| typedef int item; |
| }; |
| template <> struct O1_size_impl<int> { |
| template <typename List> struct apply : List::size {}; |
| }; |
| template <typename> struct l_iter; |
| template <typename Node> struct deref<l_iter<Node>> { |
| typedef typename Node::item type; |
| }; |
| template <> struct begin_impl<int> { |
| template <typename List> struct apply { |
| typedef l_iter<typename List::type> type; |
| }; |
| }; |
| template <typename, typename, typename, typename, typename, typename, typename> |
| struct list : l_item {}; |
| template <typename... T> struct make_variant_list { typedef list<T...> type; }; |
| template <typename T> T cast_storage(void *p1) { return *static_cast<T *>(p1); } |
| struct visitation_impl_step { |
| typedef Trans_NS__v1_GenericUnsupportedTlv type; |
| }; |
| template <typename Visitor, typename VoidPtrCV, typename T> |
| void visitation_impl_invoke_impl(Visitor p1, VoidPtrCV p2, T *) { |
| backup_holder<Trans_NS__v1_GenericUnsupportedTlv> __trans_tmp_8 = |
| cast_storage<backup_holder<T>>(p2); |
| p1.internal_visit(__trans_tmp_8, 0); |
| } |
| template <typename Visitor, typename VoidPtrCV, typename T, |
| typename NoBackupFlag> |
| void visitation_impl_invoke(Visitor p1, VoidPtrCV p2, T p3, NoBackupFlag) { |
| visitation_impl_invoke_impl(p1, p2, p3); |
| } |
| template <typename Which, typename step0, typename Visitor, typename VoidPtrCV, |
| typename NoBackupFlag> |
| void visitation_impl(Visitor p1, VoidPtrCV p2, NoBackupFlag, Which, step0 *) { |
| visitation_impl_invoke(p1, p2, static_cast<typename step0::type *>(0), 0); |
| } |
| struct move_into { |
| move_into(void *); |
| template <typename T> void internal_visit(backup_holder<T> p1, int) { |
| T __trans_tmp_2 = p1.get(); |
| new (0) T(__trans_tmp_2); |
| } |
| }; |
| template <typename, typename... TN> struct variant { |
| struct initializer : iter_fold<typename make_variant_list<int, TN...>::type, |
| make_initializer_node>::type::first {}; |
| template <typename T> void convert_construct(T p1, int) { |
| void *__trans_tmp_9 = this; |
| initializer::initialize(__trans_tmp_9, p1); |
| } |
| template <typename T> variant(T p1) { convert_construct(p1, 0); } |
| variant(variant &&p1) { |
| move_into visitor(0); |
| p1.internal_apply_visitor(visitor); |
| } |
| template <typename Visitor> void internal_apply_visitor(Visitor p1) { |
| void *__trans_tmp_10 = this; |
| visitation_impl(p1, __trans_tmp_10, 0, 0, |
| static_cast<visitation_impl_step *>(0)); |
| } |
| }; |
| template <class...> struct generic_element_tlvs; |
| template <typename TlvConfig, class UnsupportedTlvClass, class TlvF, |
| class... TlvR> |
| struct generic_element_tlvs<TlvConfig, UnsupportedTlvClass, TlvF, TlvR...> { |
| typedef variant<UnsupportedTlvClass, TlvF, TlvR...> variant_type; |
| }; |
| template <typename, typename> struct Trans_NS__v1_GenericTlvContainer { |
| template <class TlvClass> void addTlv(const TlvClass &); |
| }; |
| template <typename TlvConfig, typename ElementTlvs> |
| template <class TlvClass> |
| void Trans_NS__v1_GenericTlvContainer<TlvConfig, ElementTlvs>::addTlv( |
| const TlvClass &p1) { |
| typename ElementTlvs::variant_type wrap(p1); |
| move(wrap); |
| } |
| template <typename ElementTlvs> |
| struct Trans_NS__v1_GenericContainerEntryBase |
| : Trans_NS__v1_GenericTlvContainer<int, ElementTlvs> {}; |
| template <class> |
| struct Trans_NS__v1_GenericFixedLengthTlvBase : Trans_NS__v1_GenericTlvBase { |
| unsigned long getValueLength() const; |
| }; |
| struct Trans_NS__v1_GenericUnsupportedTlv : Trans_NS__v1_GenericTlv { |
| long getHeaderLengthconst; |
| }; |
| using isis_tlv_config = int; |
| template <class... TlvClasses> |
| using isis_element_tlvs = |
| generic_element_tlvs<isis_tlv_config, Trans_NS__v1_GenericUnsupportedTlv, |
| TlvClasses...>; |
| template <int, class, typename ElementTlvs> |
| using ContainerEntryBase = Trans_NS__v1_GenericContainerEntryBase<ElementTlvs>; |
| template <int, class ImplClass, int> |
| using FixedLengthTlvBase = Trans_NS__v1_GenericFixedLengthTlvBase<ImplClass>; |
| struct IPv4NeighborAddressSubTlv |
| : FixedLengthTlvBase<0, IPv4NeighborAddressSubTlv, 0> { |
| bool operator==(const IPv4NeighborAddressSubTlv &) const; |
| }; |
| void test() { |
| ContainerEntryBase< |
| 0, int, |
| isis_element_tlvs< |
| FixedLengthTlvBase<0, int, 0>, FixedLengthTlvBase<0, int, 0>, |
| IPv4NeighborAddressSubTlv, FixedLengthTlvBase<0, int, 0>, |
| FixedLengthTlvBase<0, int, 0>, FixedLengthTlvBase<0, int, 0>>> |
| isEntry; |
| IPv4NeighborAddressSubTlv nbAddressSubTlv; |
| isEntry.addTlv(nbAddressSubTlv); |
| } |