What are the subtyping rules for tuple[T, ...]?

Thanks. 2b is not a great option—it creates an unusual special case and the semantics are likely hard to understand for many—but it’s probably the least bad option. Let’s go with it for now.

Let me write down a few cases just to make the semantics clear.

from untyped_library import SomeType  # equivalent to Any
from typing import Any, Iterable

def f(untyped_iter: Iterable[Any], some_type_tuple: tuple[SomeType, ...], any_tuple: tuple[Any, ...], int_tuple: tuple[int, ...]):
    a: tuple[int, int] = tuple(untyped_iter)  # OK
    b: tuple[int, int] = some_type_tuple  # OK (but becomes an error if `untyped_library` becomes typed)
    c: tuple[int, int] = any_tuple  # OK
    d: tuple[int, int] = int_tuple  # type checker error