summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2014-02-05 01:44:17 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2014-02-05 01:44:17 +0000
commit09df4a667574ab0dc6f4d116025c48987d7baf26 (patch)
tree88503710cbf6da367a74d40ab9ee31297c42d648
parent5fe0f6588e9b103bc66193943df4ca1e51fc836e (diff)
downloadbcm5719-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_list27
-rw-r--r--libcxx/test/containers/sequences/forwardlist/forwardlist.cons/default_recursive.pass.cpp25
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()
+{
+}
OpenPOWER on IntegriCloud