[libcxx] r200814 - Support forward_list<Incomplete Type>. Patch by Zhihao Yuan!

Peter Collingbourne peter at pcc.me.uk
Tue Feb 4 17:44:17 PST 2014


Author: pcc
Date: Tue Feb  4 19:44:17 2014
New Revision: 200814

URL: http://llvm.org/viewvc/llvm-project?rev=200814&view=rev
Log:
Support forward_list<Incomplete Type>. Patch by Zhihao Yuan!

Added:
    libcxx/trunk/test/containers/sequences/forwardlist/forwardlist.cons/default_recursive.pass.cpp
Modified:
    libcxx/trunk/include/forward_list

Modified: libcxx/trunk/include/forward_list
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/forward_list?rev=200814&r1=200813&r2=200814&view=diff
==============================================================================
--- libcxx/trunk/include/forward_list (original)
+++ libcxx/trunk/include/forward_list Tue Feb  4 19:44:17 2014
@@ -188,7 +188,6 @@ template <class _Tp, class _VoidPtr> str
 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>

Added: libcxx/trunk/test/containers/sequences/forwardlist/forwardlist.cons/default_recursive.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/forwardlist/forwardlist.cons/default_recursive.pass.cpp?rev=200814&view=auto
==============================================================================
--- libcxx/trunk/test/containers/sequences/forwardlist/forwardlist.cons/default_recursive.pass.cpp (added)
+++ libcxx/trunk/test/containers/sequences/forwardlist/forwardlist.cons/default_recursive.pass.cpp Tue Feb  4 19:44:17 2014
@@ -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()
+{
+}





More information about the cfe-commits mailing list