Skip to content

Commit fc83819

Browse files
committed
Sync from upstream.
2 parents 3b3ba3d + 5a67b76 commit fc83819

17 files changed

+106
-8
lines changed

doc/Jamfile.v2

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ doxygen autodoc
6464
\"treap_multiset_impl=treap_multiset\" \\
6565
\"treap_impl=treap\" \\
6666
\"BOOST_INTRUSIVE_OPTION_CONSTANT(OPTION_NAME, TYPE, VALUE, CONSTANT_NAME) = template<TYPE VALUE> struct OPTION_NAME{};\" \\
67+
\"BOOST_INTRUSIVE_NO_DANGLING\" \\
6768
\"BOOST_INTRUSIVE_OPTION_TYPE(OPTION_NAME, TYPE, TYPEDEF_EXPR, TYPEDEF_NAME) = template<class TYPE> struct OPTION_NAME{};\" "
6869
;
6970

include/boost/intrusive/avl_set.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,15 +554,19 @@ class avl_set
554554
inline void clone_from(BOOST_RV_REF(avl_set) src, Cloner cloner, Disposer disposer)
555555
{ Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
556556

557+
BOOST_INTRUSIVE_NO_DANGLING
557558
inline static avl_set &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
558559
{ return static_cast<avl_set &>(Base::container_from_end_iterator(end_iterator)); }
559560

561+
BOOST_INTRUSIVE_NO_DANGLING
560562
inline static const avl_set &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
561563
{ return static_cast<const avl_set &>(Base::container_from_end_iterator(end_iterator)); }
562564

565+
BOOST_INTRUSIVE_NO_DANGLING
563566
inline static avl_set &container_from_iterator(iterator it) BOOST_NOEXCEPT
564567
{ return static_cast<avl_set &>(Base::container_from_iterator(it)); }
565568

569+
BOOST_INTRUSIVE_NO_DANGLING
566570
inline static const avl_set &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
567571
{ return static_cast<const avl_set &>(Base::container_from_iterator(it)); }
568572
};
@@ -1049,15 +1053,19 @@ class avl_multiset
10491053
inline void clone_from(BOOST_RV_REF(avl_multiset) src, Cloner cloner, Disposer disposer)
10501054
{ Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
10511055

1056+
BOOST_INTRUSIVE_NO_DANGLING
10521057
inline static avl_multiset &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
10531058
{ return static_cast<avl_multiset &>(Base::container_from_end_iterator(end_iterator)); }
10541059

1060+
BOOST_INTRUSIVE_NO_DANGLING
10551061
inline static const avl_multiset &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
10561062
{ return static_cast<const avl_multiset &>(Base::container_from_end_iterator(end_iterator)); }
10571063

1064+
BOOST_INTRUSIVE_NO_DANGLING
10581065
inline static avl_multiset &container_from_iterator(iterator it) BOOST_NOEXCEPT
10591066
{ return static_cast<avl_multiset &>(Base::container_from_iterator(it)); }
10601067

1068+
BOOST_INTRUSIVE_NO_DANGLING
10611069
inline static const avl_multiset &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
10621070
{ return static_cast<const avl_multiset &>(Base::container_from_iterator(it)); }
10631071
};

include/boost/intrusive/avltree.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,15 +564,19 @@ class avltree
564564
inline void clone_from(BOOST_RV_REF(avltree) src, Cloner cloner, Disposer disposer)
565565
{ Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
566566

567+
BOOST_INTRUSIVE_NO_DANGLING
567568
inline static avltree &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
568569
{ return static_cast<avltree &>(Base::container_from_end_iterator(end_iterator)); }
569570

571+
BOOST_INTRUSIVE_NO_DANGLING
570572
inline static const avltree &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
571573
{ return static_cast<const avltree &>(Base::container_from_end_iterator(end_iterator)); }
572574

575+
BOOST_INTRUSIVE_NO_DANGLING
573576
inline static avltree &container_from_iterator(iterator it) BOOST_NOEXCEPT
574577
{ return static_cast<avltree &>(Base::container_from_iterator(it)); }
575578

579+
BOOST_INTRUSIVE_NO_DANGLING
576580
inline static const avltree &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
577581
{ return static_cast<const avltree &>(Base::container_from_iterator(it)); }
578582
};

include/boost/intrusive/bs_set.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,15 +551,19 @@ class bs_set
551551
inline void clone_from(BOOST_RV_REF(bs_set) src, Cloner cloner, Disposer disposer)
552552
{ Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
553553

554+
BOOST_INTRUSIVE_NO_DANGLING
554555
inline static bs_set &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
555556
{ return static_cast<bs_set &>(Base::container_from_end_iterator(end_iterator)); }
556557

558+
BOOST_INTRUSIVE_NO_DANGLING
557559
inline static const bs_set &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
558560
{ return static_cast<const bs_set &>(Base::container_from_end_iterator(end_iterator)); }
559561

562+
BOOST_INTRUSIVE_NO_DANGLING
560563
inline static bs_set &container_from_iterator(iterator it) BOOST_NOEXCEPT
561564
{ return static_cast<bs_set &>(Base::container_from_iterator(it)); }
562565

566+
BOOST_INTRUSIVE_NO_DANGLING
563567
inline static const bs_set &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
564568
{ return static_cast<const bs_set &>(Base::container_from_iterator(it)); }
565569
};
@@ -1045,15 +1049,19 @@ class bs_multiset
10451049
inline void clone_from(BOOST_RV_REF(bs_multiset) src, Cloner cloner, Disposer disposer)
10461050
{ Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
10471051

1052+
BOOST_INTRUSIVE_NO_DANGLING
10481053
inline static bs_multiset &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
10491054
{ return static_cast<bs_multiset &>(Base::container_from_end_iterator(end_iterator)); }
10501055

1056+
BOOST_INTRUSIVE_NO_DANGLING
10511057
inline static const bs_multiset &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
10521058
{ return static_cast<const bs_multiset &>(Base::container_from_end_iterator(end_iterator)); }
10531059

1060+
BOOST_INTRUSIVE_NO_DANGLING
10541061
inline static bs_multiset &container_from_iterator(iterator it) BOOST_NOEXCEPT
10551062
{ return static_cast<bs_multiset &>(Base::container_from_iterator(it)); }
10561063

1064+
BOOST_INTRUSIVE_NO_DANGLING
10571065
inline static const bs_multiset &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
10581066
{ return static_cast<const bs_multiset &>(Base::container_from_iterator(it)); }
10591067
};

include/boost/intrusive/bstree.hpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,8 @@ class bstree_impl
876876
//! <b>Throws</b>: Nothing.
877877
//!
878878
//! <b>Complexity</b>: Constant.
879-
static bstree_impl &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
879+
BOOST_INTRUSIVE_NO_DANGLING
880+
static bstree_impl& container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
880881
{
881882
return static_cast<bstree_impl&>
882883
(data_type::get_tree_base_from_end_iterator(end_iterator));
@@ -890,7 +891,8 @@ class bstree_impl
890891
//! <b>Throws</b>: Nothing.
891892
//!
892893
//! <b>Complexity</b>: Constant.
893-
static const bstree_impl &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
894+
BOOST_INTRUSIVE_NO_DANGLING
895+
static const bstree_impl & container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
894896
{
895897
return static_cast<bstree_impl&>
896898
(data_type::get_tree_base_from_end_iterator(end_iterator));
@@ -904,7 +906,8 @@ class bstree_impl
904906
//! <b>Throws</b>: Nothing.
905907
//!
906908
//! <b>Complexity</b>: Logarithmic.
907-
static bstree_impl &container_from_iterator(iterator it) BOOST_NOEXCEPT
909+
BOOST_INTRUSIVE_NO_DANGLING
910+
static bstree_impl & container_from_iterator(iterator it) BOOST_NOEXCEPT
908911
{ return container_from_end_iterator(it.end_iterator_from_it()); }
909912

910913
//! <b>Precondition</b>: it must be a valid end const_iterator
@@ -915,7 +918,8 @@ class bstree_impl
915918
//! <b>Throws</b>: Nothing.
916919
//!
917920
//! <b>Complexity</b>: Logarithmic.
918-
static const bstree_impl &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
921+
BOOST_INTRUSIVE_NO_DANGLING
922+
static const bstree_impl & container_from_iterator(const_iterator it) BOOST_NOEXCEPT
919923
{ return container_from_end_iterator(it.end_iterator_from_it()); }
920924

921925
#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
@@ -2215,15 +2219,19 @@ class bstree
22152219
inline void clone_from(BOOST_RV_REF(bstree) src, Cloner cloner, Disposer disposer)
22162220
{ Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
22172221

2222+
BOOST_INTRUSIVE_NO_DANGLING
22182223
inline static bstree &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
22192224
{ return static_cast<bstree &>(Base::container_from_end_iterator(end_iterator)); }
22202225

2226+
BOOST_INTRUSIVE_NO_DANGLING
22212227
inline static const bstree &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
22222228
{ return static_cast<const bstree &>(Base::container_from_end_iterator(end_iterator)); }
22232229

2230+
BOOST_INTRUSIVE_NO_DANGLING
22242231
inline static bstree &container_from_iterator(iterator it) BOOST_NOEXCEPT
22252232
{ return static_cast<bstree &>(Base::container_from_iterator(it)); }
22262233

2234+
BOOST_INTRUSIVE_NO_DANGLING
22272235
inline static const bstree &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
22282236
{ return static_cast<const bstree &>(Base::container_from_iterator(it)); }
22292237
};

include/boost/intrusive/detail/parent_from_member.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
#include <boost/intrusive/detail/config_begin.hpp>
2424
#include <boost/intrusive/detail/workaround.hpp>
25+
#include <boost/move/detail/launder.hpp>
2526
#include <cstddef>
2627

2728
#if defined(_MSC_VER)
@@ -90,15 +91,15 @@ BOOST_INTRUSIVE_FORCEINLINE std::ptrdiff_t offset_from_pointer_to_member(const M
9091
template<class Parent, class Member>
9192
BOOST_INTRUSIVE_FORCEINLINE Parent *parent_from_member(Member *member, const Member Parent::* ptr_to_member)
9293
{
93-
return reinterpret_cast<Parent*>
94-
(reinterpret_cast<std::size_t>(member) - static_cast<std::size_t>(offset_from_pointer_to_member(ptr_to_member)));
94+
return boost::move_detail::launder(reinterpret_cast<Parent*>
95+
(reinterpret_cast<std::size_t>(member) - static_cast<std::size_t>(offset_from_pointer_to_member(ptr_to_member))));
9596
}
9697

9798
template<class Parent, class Member>
9899
BOOST_INTRUSIVE_FORCEINLINE const Parent *parent_from_member(const Member *member, const Member Parent::* ptr_to_member)
99100
{
100-
return reinterpret_cast<const Parent*>
101-
( reinterpret_cast<std::size_t>(member) - static_cast<std::size_t>(offset_from_pointer_to_member(ptr_to_member)) );
101+
return boost::move_detail::launder(reinterpret_cast<const Parent*>
102+
( reinterpret_cast<std::size_t>(member) - static_cast<std::size_t>(offset_from_pointer_to_member(ptr_to_member)) ));
102103
}
103104

104105
} //namespace detail {

include/boost/intrusive/detail/workaround.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,16 @@ template<unsigned> struct static_assert_test {};
110110
(unsigned)sizeof(::boost::intrusive::detail::STATIC_ASSERTION_FAILURE<bool(B)>)>\
111111
BOOST_JOIN(boost_intrusive_static_assert_typedef_, __LINE__) BOOST_ATTRIBUTE_UNUSED
112112

113+
#endif //BOOST_NO_CXX11_STATIC_ASSERT
114+
115+
116+
//GCC has some false positives with some functions returning references.
117+
//This silences this warning in selected functions
118+
#if defined(BOOST_GCC) && (BOOST_GCC >= 140000)
119+
# define BOOST_INTRUSIVE_NO_DANGLING [[gnu::no_dangling]]
120+
#else
121+
# define BOOST_INTRUSIVE_NO_DANGLING
113122
#endif
114123

124+
115125
#endif //#ifndef BOOST_INTRUSIVE_DETAIL_WORKAROUND_HPP

include/boost/intrusive/list.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,7 @@ class list_impl
500500
//! <b>Throws</b>: Nothing.
501501
//!
502502
//! <b>Complexity</b>: Constant.
503+
BOOST_INTRUSIVE_NO_DANGLING
503504
inline static list_impl &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
504505
{ return list_impl::priv_container_from_end_iterator(end_iterator); }
505506

@@ -511,6 +512,7 @@ class list_impl
511512
//! <b>Throws</b>: Nothing.
512513
//!
513514
//! <b>Complexity</b>: Constant.
515+
BOOST_INTRUSIVE_NO_DANGLING
514516
inline static const list_impl &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
515517
{ return list_impl::priv_container_from_end_iterator(end_iterator); }
516518

@@ -1391,6 +1393,7 @@ class list_impl
13911393
/// @cond
13921394

13931395
private:
1396+
BOOST_INTRUSIVE_NO_DANGLING
13941397
static list_impl &priv_container_from_end_iterator(const const_iterator &end_iterator) BOOST_NOEXCEPT
13951398
{
13961399
BOOST_INTRUSIVE_STATIC_ASSERT((has_container_from_iterator));
@@ -1501,9 +1504,11 @@ class list
15011504
inline void clone_from(BOOST_RV_REF(list) src, Cloner cloner, Disposer disposer)
15021505
{ Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
15031506

1507+
BOOST_INTRUSIVE_NO_DANGLING
15041508
inline static list &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
15051509
{ return static_cast<list &>(Base::container_from_end_iterator(end_iterator)); }
15061510

1511+
BOOST_INTRUSIVE_NO_DANGLING
15071512
inline static const list &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
15081513
{ return static_cast<const list &>(Base::container_from_end_iterator(end_iterator)); }
15091514
};

include/boost/intrusive/rbtree.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,15 +567,19 @@ class rbtree
567567
inline void clone_from(BOOST_RV_REF(rbtree) src, Cloner cloner, Disposer disposer)
568568
{ Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
569569

570+
BOOST_INTRUSIVE_NO_DANGLING
570571
inline static rbtree &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
571572
{ return static_cast<rbtree &>(Base::container_from_end_iterator(end_iterator)); }
572573

574+
BOOST_INTRUSIVE_NO_DANGLING
573575
inline static const rbtree &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
574576
{ return static_cast<const rbtree &>(Base::container_from_end_iterator(end_iterator)); }
575577

578+
BOOST_INTRUSIVE_NO_DANGLING
576579
inline static rbtree &container_from_iterator(iterator it) BOOST_NOEXCEPT
577580
{ return static_cast<rbtree &>(Base::container_from_iterator(it)); }
578581

582+
BOOST_INTRUSIVE_NO_DANGLING
579583
inline static const rbtree &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
580584
{ return static_cast<const rbtree &>(Base::container_from_iterator(it)); }
581585
};

include/boost/intrusive/set.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,15 +554,19 @@ class set
554554
inline void clone_from(BOOST_RV_REF(set) src, Cloner cloner, Disposer disposer)
555555
{ Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
556556

557+
BOOST_INTRUSIVE_NO_DANGLING
557558
inline static set &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
558559
{ return static_cast<set &>(Base::container_from_end_iterator(end_iterator)); }
559560

561+
BOOST_INTRUSIVE_NO_DANGLING
560562
inline static const set &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
561563
{ return static_cast<const set &>(Base::container_from_end_iterator(end_iterator)); }
562564

565+
BOOST_INTRUSIVE_NO_DANGLING
563566
inline static set &container_from_iterator(iterator it) BOOST_NOEXCEPT
564567
{ return static_cast<set &>(Base::container_from_iterator(it)); }
565568

569+
BOOST_INTRUSIVE_NO_DANGLING
566570
inline static const set &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
567571
{ return static_cast<const set &>(Base::container_from_iterator(it)); }
568572
};
@@ -1049,15 +1053,19 @@ class multiset
10491053
inline void clone_from(BOOST_RV_REF(multiset) src, Cloner cloner, Disposer disposer)
10501054
{ Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
10511055

1056+
BOOST_INTRUSIVE_NO_DANGLING
10521057
inline static multiset &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
10531058
{ return static_cast<multiset &>(Base::container_from_end_iterator(end_iterator)); }
10541059

1060+
BOOST_INTRUSIVE_NO_DANGLING
10551061
inline static const multiset &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
10561062
{ return static_cast<const multiset &>(Base::container_from_end_iterator(end_iterator)); }
10571063

1064+
BOOST_INTRUSIVE_NO_DANGLING
10581065
inline static multiset &container_from_iterator(iterator it) BOOST_NOEXCEPT
10591066
{ return static_cast<multiset &>(Base::container_from_iterator(it)); }
10601067

1068+
BOOST_INTRUSIVE_NO_DANGLING
10611069
inline static const multiset &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
10621070
{ return static_cast<const multiset &>(Base::container_from_iterator(it)); }
10631071
};

0 commit comments

Comments
 (0)