[PATCH] D54563: [analyzer] MoveChecker Pt.4: Add a few more state reset methods.

Umann Kristóf via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Nov 22 07:51:05 PST 2018


Szelethus added a comment.

In https://reviews.llvm.org/D54563#1301893, @NoQ wrote:

> In https://reviews.llvm.org/D54563#1299918, @Szelethus wrote:
>
> > How about `std::list<T>::splice`?
>
>
> Hmm, you mean that it leaves its argument empty? Interesting, i guess we may need a separate facility for that.


I looked it up, and this is what I found: (source: http://eel.is/c++draft/list.ops)

> `list` provides three `splice` operations that destructively move elements from one list to another. The behavior of splice operations is undefined if `get_­allocator() != x.get_­allocator()`.
> 
>   void splice(const_iterator position, list& x);
>   void splice(const_iterator position, list&& x);
> 
> **Effects:** Inserts the contents of `x` before position and `x` becomes empty. Pointers and references to the moved elements of `x` now refer to those same elements but as members of *this. Iterators referring to the moved >elements will continue to refer to their elements, but they now behave as iterators into `*this`, not into `x`.

This suggests to me that `list1.splice(list1.begin(), std::move(list2))` leaves  `list` in a valid, well-defined, but empty state.

>   I wonder how many other state-reset methods are we forgetting.

`merge` does something similar too for `map`, `multimap`, `set`, `multiset`, as well as their unordered counterparts.

> As a TODO, we might want to warn anyway when the value of the argument is not 0.

Maybe leave a `TODO` in the code as well? ^-^


Repository:
  rC Clang

https://reviews.llvm.org/D54563





More information about the cfe-commits mailing list