diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2014-02-05 01:44:17 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2014-02-05 01:44:17 +0000 |
commit | 09df4a667574ab0dc6f4d116025c48987d7baf26 (patch) | |
tree | 88503710cbf6da367a74d40ab9ee31297c42d648 | |
parent | 5fe0f6588e9b103bc66193943df4ca1e51fc836e (diff) | |
download | bcm5719-llvm-09df4a667574ab0dc6f4d116025c48987d7baf26.tar.gz bcm5719-llvm-09df4a667574ab0dc6f4d116025c48987d7baf26.zip |
Support forward_list<Incomplete Type>. Patch by Zhihao Yuan!
llvm-svn: 200814
-rw-r--r-- | libcxx/include/forward_list | 27 | ||||
-rw-r--r-- | libcxx/test/containers/sequences/forwardlist/forwardlist.cons/default_recursive.pass.cpp | 25 |
2 files changed, 41 insertions, 11 deletions
diff --git a/libcxx/include/forward_list b/libcxx/include/forward_list index 398226b8d42..72d31dc7e07 100644 --- a/libcxx/include/forward_list +++ b/libcxx/include/forward_list @@ -188,7 +188,6 @@ template <class _Tp, class _VoidPtr> struct __forward_list_node; template <class _NodePtr> struct __forward_begin_node { - typedef __forward_begin_node __self; typedef _NodePtr pointer; pointer __next_; @@ -197,16 +196,22 @@ struct __forward_begin_node }; template <class _Tp, class _VoidPtr> -struct __forward_list_node - : public __forward_begin_node - < - typename pointer_traits<_VoidPtr>::template +struct _LIBCPP_HIDDEN __begin_node_of +{ + typedef __forward_begin_node + < + typename pointer_traits<_VoidPtr>::template #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES - rebind<__forward_list_node<_Tp, _VoidPtr> > + rebind<__forward_list_node<_Tp, _VoidPtr> > #else - rebind<__forward_list_node<_Tp, _VoidPtr> >::other + rebind<__forward_list_node<_Tp, _VoidPtr> >::other #endif - > + > type; +}; + +template <class _Tp, class _VoidPtr> +struct __forward_list_node + : public __begin_node_of<_Tp, _VoidPtr>::type { typedef _Tp value_type; @@ -357,9 +362,9 @@ protected: typedef _Tp value_type; typedef _Alloc allocator_type; - typedef typename allocator_traits<allocator_type>::void_pointer void_pointer; - typedef __forward_list_node<value_type, void_pointer> __node; - typedef typename __node::__self __begin_node; + typedef typename allocator_traits<allocator_type>::void_pointer void_pointer; + typedef __forward_list_node<value_type, void_pointer> __node; + typedef typename __begin_node_of<value_type, void_pointer>::type __begin_node; typedef typename allocator_traits<allocator_type>::template #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES rebind_alloc<__node> diff --git a/libcxx/test/containers/sequences/forwardlist/forwardlist.cons/default_recursive.pass.cpp b/libcxx/test/containers/sequences/forwardlist/forwardlist.cons/default_recursive.pass.cpp new file mode 100644 index 00000000000..5ff00e6fe52 --- /dev/null +++ b/libcxx/test/containers/sequences/forwardlist/forwardlist.cons/default_recursive.pass.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <forward_list> + +// class forward_list + +// forward_list(); + +#include <forward_list> + +struct X +{ + std::forward_list<X> q; +}; + +int main() +{ +} |