1# mode: run
2# tag: cpp, werror, cpp11
3
4from libcpp cimport nullptr
5from libcpp.memory cimport shared_ptr, make_shared
6from libcpp.utility cimport move
7from cython.operator cimport dereference
8
9cdef extern from *:
10    """
11    #include <string>
12
13    template<typename T> const char* move_helper(T&) { return "lvalue-ref"; }
14    template<typename T> const char* move_helper(T&&) { return "rvalue-ref"; }
15    """
16    const char* move_helper[T](T)
17
18def test_move_assignment():
19    """
20    >>> test_move_assignment()
21    """
22    cdef shared_ptr[int] p1, p2
23    p1 = make_shared[int](1337)
24    p2 = move(p1)
25    assert p1 == nullptr
26    assert dereference(p2) == 1337
27
28def test_move_func_call():
29    """
30    >>> test_move_func_call()
31    """
32    cdef shared_ptr[int] p
33    assert move_helper(p) == b'lvalue-ref'
34    assert move_helper(move(p)) == b'rvalue-ref'
35