summaryrefslogtreecommitdiff
path: root/tests/compile/cpp_temp_assignment.pyx
diff options
context:
space:
mode:
Diffstat (limited to 'tests/compile/cpp_temp_assignment.pyx')
-rw-r--r--tests/compile/cpp_temp_assignment.pyx98
1 files changed, 98 insertions, 0 deletions
diff --git a/tests/compile/cpp_temp_assignment.pyx b/tests/compile/cpp_temp_assignment.pyx
new file mode 100644
index 000000000..58ae39a70
--- /dev/null
+++ b/tests/compile/cpp_temp_assignment.pyx
@@ -0,0 +1,98 @@
+# tag: cpp,cpp11
+# mode: compile
+# tag: no-cpp-locals
+# TODO cpp_locals works fine with the standard library that comes with gcc11
+# but not with gcc8. Therefore disable the test for now
+
+cdef extern from *:
+ """
+ class NoAssignIterator {
+ public:
+ explicit NoAssignIterator(int pos) : pos_(pos) {}
+ NoAssignIterator(NoAssignIterator&) = delete;
+ NoAssignIterator(NoAssignIterator&&) {}
+ NoAssignIterator& operator=(NoAssignIterator&) = delete;
+ NoAssignIterator& operator=(NoAssignIterator&&) { return *this; }
+ // Default constructor of temp variable is needed by Cython
+ // as of 3.0a6.
+ NoAssignIterator() : pos_(0) {}
+ int operator*() {
+ return pos_;
+ }
+ NoAssignIterator operator++() {
+ return NoAssignIterator(pos_ + 1);
+ }
+ int operator!=(NoAssignIterator other) {
+ return pos_ != other.pos_;
+ }
+ int pos_;
+ };
+ class NoAssign {
+ public:
+ NoAssign() {}
+ NoAssign(NoAssign&) = delete;
+ NoAssign(NoAssign&&) {}
+ NoAssign& operator=(NoAssign&) = delete;
+ NoAssign& operator=(NoAssign&&) { return *this; }
+ void func() {}
+ NoAssignIterator begin() {
+ return NoAssignIterator(0);
+ }
+ NoAssignIterator end() {
+ return NoAssignIterator(2);
+ }
+ };
+
+ NoAssign get_NoAssign_Py() {
+ return NoAssign();
+ }
+ NoAssign get_NoAssign_Cpp() {
+ return NoAssign();
+ }
+
+ """
+ cdef cppclass NoAssignIterator:
+ int operator*()
+ NoAssignIterator operator++()
+ int operator!=(NoAssignIterator)
+
+ cdef cppclass NoAssign:
+ void func()
+ NoAssignIterator begin()
+ NoAssignIterator end()
+
+ # might raise Python exception (thus needs a temp)
+ NoAssign get_NoAssign_Py() except *
+ # might raise C++ exception (thus needs a temp)
+ NoAssign get_NoAssign_Cpp() except +
+
+cdef internal_cpp_func(NoAssign arg):
+ pass
+
+def test_call_to_function():
+ # will fail to compile if move constructors aren't used
+ internal_cpp_func(get_NoAssign_Py())
+ internal_cpp_func(get_NoAssign_Cpp())
+
+def test_assignment_to_name():
+ # will fail if move constructors aren't used
+ cdef NoAssign value
+ value = get_NoAssign_Py()
+ value = get_NoAssign_Cpp()
+
+def test_assignment_to_scope():
+ cdef NoAssign value
+ value = get_NoAssign_Py()
+ value = get_NoAssign_Cpp()
+ def inner():
+ value.func()
+
+cdef class AssignToClassAttr:
+ cdef NoAssign attr
+ def __init__(self):
+ self.attr = get_NoAssign_Py()
+ self.attr = get_NoAssign_Cpp()
+
+def test_generator_cpp_iterator_as_temp():
+ for i in get_NoAssign_Py():
+ yield i