Skip to content

Incorrect inference with ambiguous overloads with mutiple arguments #2906

@randolf-scholz

Description

@randolf-scholz

Summary

https://play.ty.dev/7e986f4b-4688-4a6f-951b-f78ef9eebb09

from typing import Any, overload, assert_type

class A[T]:  # covariant
    def get(self) -> T: ...

@overload
def op(l: A[None], r: A[None]) -> A[None]: ...
@overload
def op(l: A[None], r: A[Any]) -> A[None]: ...
@overload
def op(l: A[Any], r: A[None]) -> A[None]: ...
@overload
def op(l: A[Any], r: A[Any]) -> A[Any]: ...

def test(x: A[None], y: A[Any]) -> None:
    assert_type(op(x, x), A[None])  # spec: ✅️ 
    assert_type(op(x, y), A[None])  # spec: ✅️
    assert_type(op(y, x), A[None])  # spec: ✅️
    assert_type(op(y, y), Any)     # spec: ❌️ (expected Any)

ty incorrectly infers A[None] for op(A[Any], A[Any]). See python/typing#2196 and #665 for context.

Single argument ambiguous overloads seem to currently infer as Unknown.

Version

No response

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions