1# mode: run
2# tag: condexpr, cpp
3
4cdef extern from "if_else_expr_cpp_helper.h":
5    cdef cppclass Holder:
6        int value
7        Holder()
8        Holder(int value)
9
10    cdef Holder v1
11    cdef Holder v2
12    cdef Holder& get_v1()
13    cdef Holder& get_v2()
14
15cdef reset() :
16    v1.value = 1
17    v2.value = 2
18
19def test_one_ref(bint b):
20    """
21    >>> test_one_ref(False)
22    1
23    >>> test_one_ref(True)
24    100
25    """
26    reset()
27    return (Holder(100) if b else get_v1()).value
28
29def test_both_ref(bint b):
30    """
31    >>> test_both_ref(False)
32    (1, 100)
33    >>> test_both_ref(True)
34    (100, 2)
35    """
36    reset()
37    try:
38        (get_v1() if b else get_v2()).value = 100
39        return v1.value, v2.value
40    finally:
41        reset()
42