diff --git a/crates/ty_python_semantic/resources/mdtest/snapshots/functions.md_-_Generic_functions___L…_-_Inferring_a_bound_ty…_(d50204b9d91b7bd1).snap b/crates/ty_python_semantic/resources/mdtest/snapshots/functions.md_-_Generic_functions___L…_-_Inferring_a_bound_ty…_(d50204b9d91b7bd1).snap index 3831ad8e67..e378193d08 100644 --- a/crates/ty_python_semantic/resources/mdtest/snapshots/functions.md_-_Generic_functions___L…_-_Inferring_a_bound_ty…_(d50204b9d91b7bd1).snap +++ b/crates/ty_python_semantic/resources/mdtest/snapshots/functions.md_-_Generic_functions___L…_-_Inferring_a_bound_ty…_(d50204b9d91b7bd1).snap @@ -74,7 +74,7 @@ error[invalid-argument-type]: Argument to function `f` is incorrect 10 | reveal_type(f(True)) # revealed: Literal[True] 11 | # error: [invalid-argument-type] 12 | reveal_type(f("string")) # revealed: Unknown - | ^^^^^^^^ Argument type `Literal["string"]` does not satisfy upper bound of type variable `T` + | ^^^^^^^^ Argument type `Literal["string"]` does not satisfy upper bound of type variable `T` (int) | info: Type variable defined here --> src/mdtest_snippet.py:4:1 diff --git a/crates/ty_python_semantic/resources/mdtest/snapshots/functions.md_-_Generic_functions___L…_-_Inferring_a_constrai…_(48ab83f977c109b4).snap b/crates/ty_python_semantic/resources/mdtest/snapshots/functions.md_-_Generic_functions___L…_-_Inferring_a_constrai…_(48ab83f977c109b4).snap index f0223b5e64..1ec6fa1685 100644 --- a/crates/ty_python_semantic/resources/mdtest/snapshots/functions.md_-_Generic_functions___L…_-_Inferring_a_constrai…_(48ab83f977c109b4).snap +++ b/crates/ty_python_semantic/resources/mdtest/snapshots/functions.md_-_Generic_functions___L…_-_Inferring_a_constrai…_(48ab83f977c109b4).snap @@ -89,7 +89,7 @@ error[invalid-argument-type]: Argument to function `f` is incorrect 11 | reveal_type(f(None)) # revealed: None 12 | # error: [invalid-argument-type] 13 | reveal_type(f("string")) # revealed: Unknown - | ^^^^^^^^ Argument type `Literal["string"]` does not satisfy constraints of type variable `T` + | ^^^^^^^^ Argument type `Literal["string"]` does not satisfy constraints of type variable `T` (int, None) | info: Type variable defined here --> src/mdtest_snippet.py:4:1 diff --git a/crates/ty_python_semantic/resources/mdtest/snapshots/functions.md_-_Generic_functions___P…_-_Inferring_a_bound_ty…_(5935d14c26afe407).snap b/crates/ty_python_semantic/resources/mdtest/snapshots/functions.md_-_Generic_functions___P…_-_Inferring_a_bound_ty…_(5935d14c26afe407).snap index fc5bb331f1..8fb6707ee8 100644 --- a/crates/ty_python_semantic/resources/mdtest/snapshots/functions.md_-_Generic_functions___P…_-_Inferring_a_bound_ty…_(5935d14c26afe407).snap +++ b/crates/ty_python_semantic/resources/mdtest/snapshots/functions.md_-_Generic_functions___P…_-_Inferring_a_bound_ty…_(5935d14c26afe407).snap @@ -71,7 +71,7 @@ error[invalid-argument-type]: Argument to function `f` is incorrect 7 | reveal_type(f(True)) # revealed: Literal[True] 8 | # error: [invalid-argument-type] 9 | reveal_type(f("string")) # revealed: Unknown - | ^^^^^^^^ Argument type `Literal["string"]` does not satisfy upper bound of type variable `T` + | ^^^^^^^^ Argument type `Literal["string"]` does not satisfy upper bound of type variable `T` (int) | info: Type variable defined here --> src/mdtest_snippet.py:3:7 diff --git a/crates/ty_python_semantic/resources/mdtest/snapshots/functions.md_-_Generic_functions___P…_-_Inferring_a_constrai…_(d2c475fccc70a8e2).snap b/crates/ty_python_semantic/resources/mdtest/snapshots/functions.md_-_Generic_functions___P…_-_Inferring_a_constrai…_(d2c475fccc70a8e2).snap index 8a961a23fc..6480fc787f 100644 --- a/crates/ty_python_semantic/resources/mdtest/snapshots/functions.md_-_Generic_functions___P…_-_Inferring_a_constrai…_(d2c475fccc70a8e2).snap +++ b/crates/ty_python_semantic/resources/mdtest/snapshots/functions.md_-_Generic_functions___P…_-_Inferring_a_constrai…_(d2c475fccc70a8e2).snap @@ -86,7 +86,7 @@ error[invalid-argument-type]: Argument to function `f` is incorrect 8 | reveal_type(f(None)) # revealed: None 9 | # error: [invalid-argument-type] 10 | reveal_type(f("string")) # revealed: Unknown - | ^^^^^^^^ Argument type `Literal["string"]` does not satisfy constraints of type variable `T` + | ^^^^^^^^ Argument type `Literal["string"]` does not satisfy constraints of type variable `T` (int, None) | info: Type variable defined here --> src/mdtest_snippet.py:3:7 diff --git a/crates/ty_python_semantic/resources/mdtest/snapshots/union_call.md_-_Calling_a_union_of_f…_-_Try_to_cover_all_pos…_-_Cover_non-keyword_re…_(707b284610419a54).snap b/crates/ty_python_semantic/resources/mdtest/snapshots/union_call.md_-_Calling_a_union_of_f…_-_Try_to_cover_all_pos…_-_Cover_non-keyword_re…_(707b284610419a54).snap index 52a55ed12c..5d04867006 100644 --- a/crates/ty_python_semantic/resources/mdtest/snapshots/union_call.md_-_Calling_a_union_of_f…_-_Try_to_cover_all_pos…_-_Cover_non-keyword_re…_(707b284610419a54).snap +++ b/crates/ty_python_semantic/resources/mdtest/snapshots/union_call.md_-_Calling_a_union_of_f…_-_Try_to_cover_all_pos…_-_Cover_non-keyword_re…_(707b284610419a54).snap @@ -188,7 +188,7 @@ error[invalid-argument-type]: Argument to function `f4` is incorrect 58 | # error: [call-non-callable] "Object of type `Literal[5]` is not callable" 59 | # error: [call-non-callable] "Object of type `PossiblyNotCallable` is not callable (possibly unbound `__call__` method)" 60 | x = f(3) - | ^ Argument type `Literal[3]` does not satisfy upper bound of type variable `T` + | ^ Argument type `Literal[3]` does not satisfy upper bound of type variable `T` (str) | info: Type variable defined here --> src/mdtest_snippet.py:13:8 diff --git a/crates/ty_python_semantic/src/types/call/bind.rs b/crates/ty_python_semantic/src/types/call/bind.rs index e08c50b5b8..819016639b 100644 --- a/crates/ty_python_semantic/src/types/call/bind.rs +++ b/crates/ty_python_semantic/src/types/call/bind.rs @@ -3086,14 +3086,20 @@ impl<'db> BindingError<'db> { String::new() } )); - diag.set_primary_message(format_args!( - "Argument type `{argument_ty_display}` does not satisfy {} of type variable `{}`", - match error { - SpecializationError::MismatchedBound {..} => "upper bound", - SpecializationError::MismatchedConstraint {..} => "constraints", - }, - typevar.name(context.db()), - )); + + let typevar_name = typevar.name(context.db()); + match error { + SpecializationError::MismatchedBound { .. } => { + diag.set_primary_message(format_args!("Argument type `{argument_ty_display}` does not satisfy upper bound of type variable `{typevar_name}` ({})", + typevar.upper_bound(context.db()).expect("type variable should have an upper bound if this error occurs").display(context.db()) + )); + } + SpecializationError::MismatchedConstraint { .. } => { + diag.set_primary_message(format_args!("Argument type `{argument_ty_display}` does not satisfy constraints of type variable `{typevar_name}` ({})", + typevar.constraints(context.db()).expect("type variable should have constraints if this error occurs").iter().map(|ty| ty.display(context.db())).join(", ") + )); + } + } if let Some(typevar_definition) = typevar.definition(context.db()) { let module = parsed_module(context.db(), typevar_definition.file(context.db()))