ruff/crates/ty_python_semantic/resources/mdtest/declaration/error.md
David Peter 86fd9b634e
[ty] Format conflicting types as an enumeration (#18956)
## Summary

Format conflicting declared types as
```
`str`, `int` and `bytes`
```

Thanks to @AlexWaygood for the initial draft.

@dcreager, looking forward to your one-character follow-up PR.
2025-06-26 14:29:33 +02:00

1.7 KiB

Errors while declaring

Violates previous assignment

x = 1
x: str  # error: [invalid-declaration] "Cannot declare type `str` for inferred type `Literal[1]`"

Incompatible declarations

def _(flag: bool):
    if flag:
        x: str
    else:
        x: int

    x = 1  # error: [conflicting-declarations] "Conflicting declared types for `x`: `str` and `int`"

Incompatible declarations for 2 (out of 3) types

def _(flag1: bool, flag2: bool):
    if flag1:
        x: str
    elif flag2:
        x: int

    # Here, the declared type for `x` is `int | str | Unknown`.
    x = 1  # error: [conflicting-declarations] "Conflicting declared types for `x`: `str` and `int`"

Incompatible declarations with repeated types

def _(flag1: bool, flag2: bool, flag3: bool, flag4: bool):
    if flag1:
        x: str
    elif flag2:
        x: int
    elif flag3:
        x: int
    elif flag4:
        x: str
    else:
        x: bytes

    x = "a"  # error: [conflicting-declarations] "Conflicting declared types for `x`: `str`, `int` and `bytes`"

Incompatible declarations with bad assignment

def _(flag: bool):
    if flag:
        x: str
    else:
        x: int

    # error: [conflicting-declarations]
    # error: [invalid-assignment]
    x = b"foo"

No errors

Currently, we avoid raising the conflicting-declarations for the following cases:

Partial declarations

def _(flag: bool):
    if flag:
        x: int

    x = 1

Partial declarations in try-except

Refer to https://github.com/astral-sh/ruff/issues/13966

def _():
    try:
        x: int = 1
    except:
        x = 2

    x = 3