Skip to content

Expand unions in order to solve generic overloads more precisely #4120

Description

@rouge8

Describe the Bug

from typing import overload, TypeVar, NoReturn, reveal_type

T = TypeVar('T')

@overload
def not_none(val: None) -> NoReturn: ...

@overload
def not_none(val: T) -> T: ...

def not_none(val: T | None) -> T:
    if val is not None:
        return val
    else:
        raise AssertionError("It was None!")

def maybe_none() -> int | None:
    return 1

x = maybe_none()
reveal_type(x)

y = not_none(x)
reveal_type(y)

Python: 3.12

As of python/mypy#15846, mypy is able to infer that y is of type int, not int | None. It would be great if pyrefly could do the same!

Sandbox Link

https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeS4ATrgLYAEALqcROgOZ0Q3G6UN24AbjEpRcqTABo6AFWYwAaqkrSAcrgBKMBgFdK6aZRjDUUAPpNiMADrpbMugF5Z8pZQAUAchmeAlLdsAASERMQlbTBgwOnRcBjNY9Bh3QVNEOnUk3zoAWgA%2BDM1tPXR0wnKA9GDhUXFMCKiYuITcJJS02Wz82TKKuyxG2PjE5NSodIcAH0Ks3IKZRFs6Zc5osc44Jv5MmEX0FYO6I119OjGllZgoOF2Lw6PUCBu6AEE4G74IVoBRSmoPawgACS-AA7qhNjsAISA-z9SLRGioUjYGAtNpdAqsfjTHZ7A7HEp0ACMlXwTjoSJRaJG7jhRhM5ksyXwcNspApQ3RLPpxhgpgs8ncpF8IEkIDIRjAUFIhAYtCgFAAxHQAAqkKUyuhoLB4ckAY1akDYelQDC%2B6EIthVAGUYDA6AALBgMYhwRAAeg9kqiMsIvDYHpg6A9mFw%2BrgHsN6GNpvNrQ9dDAvDoqFS0FQ2FgdGjscoZotAmI8fQcCt6DIDEdrRyNTghecgIAzIRiQAmQG2ADaIn%2BcAAurYdOguDw%2BDBMDlMBAjPrzcIKZ4IGxYkZPLYhjkjABHHQzic5ADWMFIOVQ%2Bv18E2zk84P06-QIAAvuLz-OYAAxaAwCg6nAEEhyCfIA

(Only applicable for extension issues) IDE Information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions