[Libreoffice-commits] core.git: sw/inc

Stephan Bergmann sbergman at redhat.com
Wed Feb 4 05:10:22 PST 2015


 sw/inc/ring.hxx |   32 ++++++++++++++++----------------
 1 file changed, 16 insertions(+), 16 deletions(-)

New commits:
commit 8b12e63b60530a2ad3769bc4983cc09bedd34c79
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Wed Feb 4 14:08:40 2015 +0100

    Don't downcast from Ring<T> base class ctor/dtor to derived class T
    
    ...it is undefined behavior.
    
    Change-Id: I16b66d4c5b98f54bf1a1c692c96b65f5b2d8084c

diff --git a/sw/inc/ring.hxx b/sw/inc/ring.hxx
index 85f62bd..bfc9318 100644
--- a/sw/inc/ring.hxx
+++ b/sw/inc/ring.hxx
@@ -43,7 +43,7 @@ namespace sw
             typedef RingContainer<value_type> ring_container;
             typedef RingContainer<const_value_type> const_ring_container;
             virtual ~Ring()
-                { algo::unlink(static_cast< value_type* >(this)); };
+                { algo::unlink(this); };
             /**
              * Removes this item from its current ring container and adds it to
              * another ring container. If the item was not alone in the original
@@ -65,8 +65,8 @@ namespace sw
              * are alone in one.
              */
             Ring()
-                : pNext(static_cast< value_type* >(this))
-                , pPrev(static_cast< value_type* >(this))
+                : pNext(this)
+                , pPrev(this)
                 { }
             /**
              * Creates a new item and add it to an existing ring container.
@@ -76,16 +76,16 @@ namespace sw
             Ring( value_type* pRing );
             /** @return the next item in the ring container */
             value_type* GetNextInRing()
-                { return pNext; }
+                { return static_cast<value_type *>(pNext); }
             /** @return the previous item in the ring container */
             value_type* GetPrevInRing()
-                { return pPrev; }
+                { return static_cast<value_type *>(pPrev); }
             /** @return the next item in the ring container */
             const_value_type* GetNextInRing() const
-                { return pNext; }
+                { return static_cast<value_type *>(pNext); }
             /** @return the previous item in the ring container */
             const_value_type* GetPrevInRing() const
-                { return pPrev; }
+                { return static_cast<value_type *>(pPrev); }
             /** @return true if and only if this item is alone in its ring */
             bool unique() const
                 { return algo::unique(static_cast< const_value_type* >(this)); }
@@ -94,12 +94,12 @@ namespace sw
             /** internal implementation class -- not for external use */
             struct Ring_node_traits
             {
-                typedef value_type node;
-                typedef value_type* node_ptr;
-                typedef const value_type* const_node_ptr;
-                static node_ptr get_next(const_node_ptr n) { return const_cast<node_ptr>(static_cast<const_node_ptr>(n))->GetNextInRing(); };
+                typedef Ring node;
+                typedef Ring* node_ptr;
+                typedef const Ring* const_node_ptr;
+                static node_ptr get_next(const_node_ptr n) { return const_cast<node_ptr>(n)->pNext; };
                 static void set_next(node_ptr n, node_ptr next) { n->pNext = next; };
-                static node_ptr get_previous(const_node_ptr n) { return const_cast<node_ptr>(static_cast<const_node_ptr>(n))->GetPrevInRing(); };
+                static node_ptr get_previous(const_node_ptr n) { return const_cast<node_ptr>(n)->pPrev; };
                 static void set_previous(node_ptr n, node_ptr previous) { n->pPrev = previous; };
             };
 #if !defined(__clang__) && defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ < 7)
@@ -116,14 +116,14 @@ namespace sw
 #endif
             friend class boost::iterator_core_access;
             typedef boost::intrusive::circular_list_algorithms<Ring_node_traits> algo;
-            value_type* pNext;
-            value_type* pPrev;
+            Ring* pNext;
+            Ring* pPrev;
     };
 
     template <typename value_type>
     inline Ring<value_type>::Ring( value_type* pObj )
-        : pNext(static_cast< value_type* >(this))
-        , pPrev(static_cast< value_type* >(this))
+        : pNext(this)
+        , pPrev(this)
     {
         if( pObj )
         {


More information about the Libreoffice-commits mailing list