17db96d56Sopenharmony_cidoctests = """
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ciSetup
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ci    >>> class AClass:
67db96d56Sopenharmony_ci    ...    def __init__(self):
77db96d56Sopenharmony_ci    ...        self._setitem_name = None
87db96d56Sopenharmony_ci    ...        self._setitem_val = None
97db96d56Sopenharmony_ci    ...        self._delitem_name = None
107db96d56Sopenharmony_ci    ...    def __setitem__(self, name, val):
117db96d56Sopenharmony_ci    ...        self._delitem_name = None
127db96d56Sopenharmony_ci    ...        self._setitem_name = name
137db96d56Sopenharmony_ci    ...        self._setitem_val = val
147db96d56Sopenharmony_ci    ...    def __repr__(self):
157db96d56Sopenharmony_ci    ...        if self._setitem_name is not None:
167db96d56Sopenharmony_ci    ...            return f"A[{self._setitem_name}]={self._setitem_val}"
177db96d56Sopenharmony_ci    ...        elif self._delitem_name is not None:
187db96d56Sopenharmony_ci    ...            return f"delA[{self._delitem_name}]"
197db96d56Sopenharmony_ci    ...    def __getitem__(self, name):
207db96d56Sopenharmony_ci    ...        return ParameterisedA(name)
217db96d56Sopenharmony_ci    ...    def __delitem__(self, name):
227db96d56Sopenharmony_ci    ...        self._setitem_name = None
237db96d56Sopenharmony_ci    ...        self._delitem_name = name
247db96d56Sopenharmony_ci    ...
257db96d56Sopenharmony_ci    >>> class ParameterisedA:
267db96d56Sopenharmony_ci    ...    def __init__(self, name):
277db96d56Sopenharmony_ci    ...        self._name = name
287db96d56Sopenharmony_ci    ...    def __repr__(self):
297db96d56Sopenharmony_ci    ...        return f"A[{self._name}]"
307db96d56Sopenharmony_ci    ...    def __iter__(self):
317db96d56Sopenharmony_ci    ...        for p in self._name:
327db96d56Sopenharmony_ci    ...            yield p
337db96d56Sopenharmony_ci    >>> class B:
347db96d56Sopenharmony_ci    ...    def __iter__(self):
357db96d56Sopenharmony_ci    ...        yield StarredB()
367db96d56Sopenharmony_ci    ...    def __repr__(self):
377db96d56Sopenharmony_ci    ...        return "B"
387db96d56Sopenharmony_ci    >>> class StarredB:
397db96d56Sopenharmony_ci    ...    def __repr__(self):
407db96d56Sopenharmony_ci    ...        return "StarredB"
417db96d56Sopenharmony_ci    >>> A = AClass()
427db96d56Sopenharmony_ci    >>> b = B()
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ciSlices that are supposed to work, starring our custom B class
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ci    >>> A[*b]
477db96d56Sopenharmony_ci    A[(StarredB,)]
487db96d56Sopenharmony_ci    >>> A[*b] = 1; A
497db96d56Sopenharmony_ci    A[(StarredB,)]=1
507db96d56Sopenharmony_ci    >>> del A[*b]; A
517db96d56Sopenharmony_ci    delA[(StarredB,)]
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ci    >>> A[*b, *b]
547db96d56Sopenharmony_ci    A[(StarredB, StarredB)]
557db96d56Sopenharmony_ci    >>> A[*b, *b] = 1; A
567db96d56Sopenharmony_ci    A[(StarredB, StarredB)]=1
577db96d56Sopenharmony_ci    >>> del A[*b, *b]; A
587db96d56Sopenharmony_ci    delA[(StarredB, StarredB)]
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci    >>> A[b, *b]
617db96d56Sopenharmony_ci    A[(B, StarredB)]
627db96d56Sopenharmony_ci    >>> A[b, *b] = 1; A
637db96d56Sopenharmony_ci    A[(B, StarredB)]=1
647db96d56Sopenharmony_ci    >>> del A[b, *b]; A
657db96d56Sopenharmony_ci    delA[(B, StarredB)]
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci    >>> A[*b, b]
687db96d56Sopenharmony_ci    A[(StarredB, B)]
697db96d56Sopenharmony_ci    >>> A[*b, b] = 1; A
707db96d56Sopenharmony_ci    A[(StarredB, B)]=1
717db96d56Sopenharmony_ci    >>> del A[*b, b]; A
727db96d56Sopenharmony_ci    delA[(StarredB, B)]
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ci    >>> A[b, b, *b]
757db96d56Sopenharmony_ci    A[(B, B, StarredB)]
767db96d56Sopenharmony_ci    >>> A[b, b, *b] = 1; A
777db96d56Sopenharmony_ci    A[(B, B, StarredB)]=1
787db96d56Sopenharmony_ci    >>> del A[b, b, *b]; A
797db96d56Sopenharmony_ci    delA[(B, B, StarredB)]
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci    >>> A[*b, b, b]
827db96d56Sopenharmony_ci    A[(StarredB, B, B)]
837db96d56Sopenharmony_ci    >>> A[*b, b, b] = 1; A
847db96d56Sopenharmony_ci    A[(StarredB, B, B)]=1
857db96d56Sopenharmony_ci    >>> del A[*b, b, b]; A
867db96d56Sopenharmony_ci    delA[(StarredB, B, B)]
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci    >>> A[b, *b, b]
897db96d56Sopenharmony_ci    A[(B, StarredB, B)]
907db96d56Sopenharmony_ci    >>> A[b, *b, b] = 1; A
917db96d56Sopenharmony_ci    A[(B, StarredB, B)]=1
927db96d56Sopenharmony_ci    >>> del A[b, *b, b]; A
937db96d56Sopenharmony_ci    delA[(B, StarredB, B)]
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci    >>> A[b, b, *b, b]
967db96d56Sopenharmony_ci    A[(B, B, StarredB, B)]
977db96d56Sopenharmony_ci    >>> A[b, b, *b, b] = 1; A
987db96d56Sopenharmony_ci    A[(B, B, StarredB, B)]=1
997db96d56Sopenharmony_ci    >>> del A[b, b, *b, b]; A
1007db96d56Sopenharmony_ci    delA[(B, B, StarredB, B)]
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci    >>> A[b, *b, b, b]
1037db96d56Sopenharmony_ci    A[(B, StarredB, B, B)]
1047db96d56Sopenharmony_ci    >>> A[b, *b, b, b] = 1; A
1057db96d56Sopenharmony_ci    A[(B, StarredB, B, B)]=1
1067db96d56Sopenharmony_ci    >>> del A[b, *b, b, b]; A
1077db96d56Sopenharmony_ci    delA[(B, StarredB, B, B)]
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_ci    >>> A[A[b, *b, b]]
1107db96d56Sopenharmony_ci    A[A[(B, StarredB, B)]]
1117db96d56Sopenharmony_ci    >>> A[A[b, *b, b]] = 1; A
1127db96d56Sopenharmony_ci    A[A[(B, StarredB, B)]]=1
1137db96d56Sopenharmony_ci    >>> del A[A[b, *b, b]]; A
1147db96d56Sopenharmony_ci    delA[A[(B, StarredB, B)]]
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci    >>> A[*A[b, *b, b]]
1177db96d56Sopenharmony_ci    A[(B, StarredB, B)]
1187db96d56Sopenharmony_ci    >>> A[*A[b, *b, b]] = 1; A
1197db96d56Sopenharmony_ci    A[(B, StarredB, B)]=1
1207db96d56Sopenharmony_ci    >>> del A[*A[b, *b, b]]; A
1217db96d56Sopenharmony_ci    delA[(B, StarredB, B)]
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci    >>> A[b, ...]
1247db96d56Sopenharmony_ci    A[(B, Ellipsis)]
1257db96d56Sopenharmony_ci    >>> A[b, ...] = 1; A
1267db96d56Sopenharmony_ci    A[(B, Ellipsis)]=1
1277db96d56Sopenharmony_ci    >>> del A[b, ...]; A
1287db96d56Sopenharmony_ci    delA[(B, Ellipsis)]
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci    >>> A[*A[b, ...]]
1317db96d56Sopenharmony_ci    A[(B, Ellipsis)]
1327db96d56Sopenharmony_ci    >>> A[*A[b, ...]] = 1; A
1337db96d56Sopenharmony_ci    A[(B, Ellipsis)]=1
1347db96d56Sopenharmony_ci    >>> del A[*A[b, ...]]; A
1357db96d56Sopenharmony_ci    delA[(B, Ellipsis)]
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ciSlices that are supposed to work, starring a list
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ci    >>> l = [1, 2, 3]
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci    >>> A[*l]
1427db96d56Sopenharmony_ci    A[(1, 2, 3)]
1437db96d56Sopenharmony_ci    >>> A[*l] = 1; A
1447db96d56Sopenharmony_ci    A[(1, 2, 3)]=1
1457db96d56Sopenharmony_ci    >>> del A[*l]; A
1467db96d56Sopenharmony_ci    delA[(1, 2, 3)]
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ci    >>> A[*l, 4]
1497db96d56Sopenharmony_ci    A[(1, 2, 3, 4)]
1507db96d56Sopenharmony_ci    >>> A[*l, 4] = 1; A
1517db96d56Sopenharmony_ci    A[(1, 2, 3, 4)]=1
1527db96d56Sopenharmony_ci    >>> del A[*l, 4]; A
1537db96d56Sopenharmony_ci    delA[(1, 2, 3, 4)]
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ci    >>> A[0, *l]
1567db96d56Sopenharmony_ci    A[(0, 1, 2, 3)]
1577db96d56Sopenharmony_ci    >>> A[0, *l] = 1; A
1587db96d56Sopenharmony_ci    A[(0, 1, 2, 3)]=1
1597db96d56Sopenharmony_ci    >>> del A[0, *l]; A
1607db96d56Sopenharmony_ci    delA[(0, 1, 2, 3)]
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci    >>> A[1:2, *l]
1637db96d56Sopenharmony_ci    A[(slice(1, 2, None), 1, 2, 3)]
1647db96d56Sopenharmony_ci    >>> A[1:2, *l] = 1; A
1657db96d56Sopenharmony_ci    A[(slice(1, 2, None), 1, 2, 3)]=1
1667db96d56Sopenharmony_ci    >>> del A[1:2, *l]; A
1677db96d56Sopenharmony_ci    delA[(slice(1, 2, None), 1, 2, 3)]
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci    >>> repr(A[1:2, *l]) == repr(A[1:2, 1, 2, 3])
1707db96d56Sopenharmony_ci    True
1717db96d56Sopenharmony_ci
1727db96d56Sopenharmony_ciSlices that are supposed to work, starring a tuple
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ci    >>> t = (1, 2, 3)
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci    >>> A[*t]
1777db96d56Sopenharmony_ci    A[(1, 2, 3)]
1787db96d56Sopenharmony_ci    >>> A[*t] = 1; A
1797db96d56Sopenharmony_ci    A[(1, 2, 3)]=1
1807db96d56Sopenharmony_ci    >>> del A[*t]; A
1817db96d56Sopenharmony_ci    delA[(1, 2, 3)]
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ci    >>> A[*t, 4]
1847db96d56Sopenharmony_ci    A[(1, 2, 3, 4)]
1857db96d56Sopenharmony_ci    >>> A[*t, 4] = 1; A
1867db96d56Sopenharmony_ci    A[(1, 2, 3, 4)]=1
1877db96d56Sopenharmony_ci    >>> del A[*t, 4]; A
1887db96d56Sopenharmony_ci    delA[(1, 2, 3, 4)]
1897db96d56Sopenharmony_ci
1907db96d56Sopenharmony_ci    >>> A[0, *t]
1917db96d56Sopenharmony_ci    A[(0, 1, 2, 3)]
1927db96d56Sopenharmony_ci    >>> A[0, *t] = 1; A
1937db96d56Sopenharmony_ci    A[(0, 1, 2, 3)]=1
1947db96d56Sopenharmony_ci    >>> del A[0, *t]; A
1957db96d56Sopenharmony_ci    delA[(0, 1, 2, 3)]
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci    >>> A[1:2, *t]
1987db96d56Sopenharmony_ci    A[(slice(1, 2, None), 1, 2, 3)]
1997db96d56Sopenharmony_ci    >>> A[1:2, *t] = 1; A
2007db96d56Sopenharmony_ci    A[(slice(1, 2, None), 1, 2, 3)]=1
2017db96d56Sopenharmony_ci    >>> del A[1:2, *t]; A
2027db96d56Sopenharmony_ci    delA[(slice(1, 2, None), 1, 2, 3)]
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ci    >>> repr(A[1:2, *t]) == repr(A[1:2, 1, 2, 3])
2057db96d56Sopenharmony_ci    True
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ciStarring an expression (rather than a name) in a slice
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci    >>> def returns_list():
2107db96d56Sopenharmony_ci    ...     return [1, 2, 3]
2117db96d56Sopenharmony_ci
2127db96d56Sopenharmony_ci    >>> A[returns_list()]
2137db96d56Sopenharmony_ci    A[[1, 2, 3]]
2147db96d56Sopenharmony_ci    >>> A[returns_list()] = 1; A
2157db96d56Sopenharmony_ci    A[[1, 2, 3]]=1
2167db96d56Sopenharmony_ci    >>> del A[returns_list()]; A
2177db96d56Sopenharmony_ci    delA[[1, 2, 3]]
2187db96d56Sopenharmony_ci
2197db96d56Sopenharmony_ci    >>> A[returns_list(), 4]
2207db96d56Sopenharmony_ci    A[([1, 2, 3], 4)]
2217db96d56Sopenharmony_ci    >>> A[returns_list(), 4] = 1; A
2227db96d56Sopenharmony_ci    A[([1, 2, 3], 4)]=1
2237db96d56Sopenharmony_ci    >>> del A[returns_list(), 4]; A
2247db96d56Sopenharmony_ci    delA[([1, 2, 3], 4)]
2257db96d56Sopenharmony_ci
2267db96d56Sopenharmony_ci    >>> A[*returns_list()]
2277db96d56Sopenharmony_ci    A[(1, 2, 3)]
2287db96d56Sopenharmony_ci    >>> A[*returns_list()] = 1; A
2297db96d56Sopenharmony_ci    A[(1, 2, 3)]=1
2307db96d56Sopenharmony_ci    >>> del A[*returns_list()]; A
2317db96d56Sopenharmony_ci    delA[(1, 2, 3)]
2327db96d56Sopenharmony_ci
2337db96d56Sopenharmony_ci    >>> A[*returns_list(), 4]
2347db96d56Sopenharmony_ci    A[(1, 2, 3, 4)]
2357db96d56Sopenharmony_ci    >>> A[*returns_list(), 4] = 1; A
2367db96d56Sopenharmony_ci    A[(1, 2, 3, 4)]=1
2377db96d56Sopenharmony_ci    >>> del A[*returns_list(), 4]; A
2387db96d56Sopenharmony_ci    delA[(1, 2, 3, 4)]
2397db96d56Sopenharmony_ci
2407db96d56Sopenharmony_ci    >>> A[0, *returns_list()]
2417db96d56Sopenharmony_ci    A[(0, 1, 2, 3)]
2427db96d56Sopenharmony_ci    >>> A[0, *returns_list()] = 1; A
2437db96d56Sopenharmony_ci    A[(0, 1, 2, 3)]=1
2447db96d56Sopenharmony_ci    >>> del A[0, *returns_list()]; A
2457db96d56Sopenharmony_ci    delA[(0, 1, 2, 3)]
2467db96d56Sopenharmony_ci
2477db96d56Sopenharmony_ci    >>> A[*returns_list(), *returns_list()]
2487db96d56Sopenharmony_ci    A[(1, 2, 3, 1, 2, 3)]
2497db96d56Sopenharmony_ci    >>> A[*returns_list(), *returns_list()] = 1; A
2507db96d56Sopenharmony_ci    A[(1, 2, 3, 1, 2, 3)]=1
2517db96d56Sopenharmony_ci    >>> del A[*returns_list(), *returns_list()]; A
2527db96d56Sopenharmony_ci    delA[(1, 2, 3, 1, 2, 3)]
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ciUsing both a starred object and a start:stop in a slice
2557db96d56Sopenharmony_ci(See also tests in test_syntax confirming that starring *inside* a start:stop
2567db96d56Sopenharmony_ciis *not* valid syntax.)
2577db96d56Sopenharmony_ci
2587db96d56Sopenharmony_ci    >>> A[1:2, *b]
2597db96d56Sopenharmony_ci    A[(slice(1, 2, None), StarredB)]
2607db96d56Sopenharmony_ci    >>> A[*b, 1:2]
2617db96d56Sopenharmony_ci    A[(StarredB, slice(1, 2, None))]
2627db96d56Sopenharmony_ci    >>> A[1:2, *b, 1:2]
2637db96d56Sopenharmony_ci    A[(slice(1, 2, None), StarredB, slice(1, 2, None))]
2647db96d56Sopenharmony_ci    >>> A[*b, 1:2, *b]
2657db96d56Sopenharmony_ci    A[(StarredB, slice(1, 2, None), StarredB)]
2667db96d56Sopenharmony_ci
2677db96d56Sopenharmony_ci    >>> A[1:, *b]
2687db96d56Sopenharmony_ci    A[(slice(1, None, None), StarredB)]
2697db96d56Sopenharmony_ci    >>> A[*b, 1:]
2707db96d56Sopenharmony_ci    A[(StarredB, slice(1, None, None))]
2717db96d56Sopenharmony_ci    >>> A[1:, *b, 1:]
2727db96d56Sopenharmony_ci    A[(slice(1, None, None), StarredB, slice(1, None, None))]
2737db96d56Sopenharmony_ci    >>> A[*b, 1:, *b]
2747db96d56Sopenharmony_ci    A[(StarredB, slice(1, None, None), StarredB)]
2757db96d56Sopenharmony_ci
2767db96d56Sopenharmony_ci    >>> A[:1, *b]
2777db96d56Sopenharmony_ci    A[(slice(None, 1, None), StarredB)]
2787db96d56Sopenharmony_ci    >>> A[*b, :1]
2797db96d56Sopenharmony_ci    A[(StarredB, slice(None, 1, None))]
2807db96d56Sopenharmony_ci    >>> A[:1, *b, :1]
2817db96d56Sopenharmony_ci    A[(slice(None, 1, None), StarredB, slice(None, 1, None))]
2827db96d56Sopenharmony_ci    >>> A[*b, :1, *b]
2837db96d56Sopenharmony_ci    A[(StarredB, slice(None, 1, None), StarredB)]
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ci    >>> A[:, *b]
2867db96d56Sopenharmony_ci    A[(slice(None, None, None), StarredB)]
2877db96d56Sopenharmony_ci    >>> A[*b, :]
2887db96d56Sopenharmony_ci    A[(StarredB, slice(None, None, None))]
2897db96d56Sopenharmony_ci    >>> A[:, *b, :]
2907db96d56Sopenharmony_ci    A[(slice(None, None, None), StarredB, slice(None, None, None))]
2917db96d56Sopenharmony_ci    >>> A[*b, :, *b]
2927db96d56Sopenharmony_ci    A[(StarredB, slice(None, None, None), StarredB)]
2937db96d56Sopenharmony_ci
2947db96d56Sopenharmony_ci*args annotated as starred expression
2957db96d56Sopenharmony_ci
2967db96d56Sopenharmony_ci    >>> def f1(*args: *b): pass
2977db96d56Sopenharmony_ci    >>> f1.__annotations__
2987db96d56Sopenharmony_ci    {'args': StarredB}
2997db96d56Sopenharmony_ci
3007db96d56Sopenharmony_ci    >>> def f2(*args: *b, arg1): pass
3017db96d56Sopenharmony_ci    >>> f2.__annotations__
3027db96d56Sopenharmony_ci    {'args': StarredB}
3037db96d56Sopenharmony_ci
3047db96d56Sopenharmony_ci    >>> def f3(*args: *b, arg1: int): pass
3057db96d56Sopenharmony_ci    >>> f3.__annotations__
3067db96d56Sopenharmony_ci    {'args': StarredB, 'arg1': <class 'int'>}
3077db96d56Sopenharmony_ci
3087db96d56Sopenharmony_ci    >>> def f4(*args: *b, arg1: int = 2): pass
3097db96d56Sopenharmony_ci    >>> f4.__annotations__
3107db96d56Sopenharmony_ci    {'args': StarredB, 'arg1': <class 'int'>}
3117db96d56Sopenharmony_ci
3127db96d56Sopenharmony_ci    >>> def f5(*args: *b = (1,)): pass
3137db96d56Sopenharmony_ci    Traceback (most recent call last):
3147db96d56Sopenharmony_ci        ...
3157db96d56Sopenharmony_ci    SyntaxError: invalid syntax
3167db96d56Sopenharmony_ci"""
3177db96d56Sopenharmony_ci
3187db96d56Sopenharmony_ci__test__ = {'doctests' : doctests}
3197db96d56Sopenharmony_ci
3207db96d56Sopenharmony_cidef test_main(verbose=False):
3217db96d56Sopenharmony_ci    from test import support
3227db96d56Sopenharmony_ci    from test import test_pep646_syntax
3237db96d56Sopenharmony_ci    support.run_doctest(test_pep646_syntax, verbose)
3247db96d56Sopenharmony_ci
3257db96d56Sopenharmony_ciif __name__ == "__main__":
3267db96d56Sopenharmony_ci    test_main(verbose=True)
327