Skip to content

Fix protocol cache for specialized self overloads - #11649

Open
Rich Chiodo (rchiodo) wants to merge 2 commits into
mainfrom
rchiodo-investigate-protocol-overload
Open

Fix protocol cache for specialized self overloads#11649
Rich Chiodo (rchiodo) wants to merge 2 commits into
mainfrom
rchiodo-investigate-protocol-overload

Conversation

@rchiodo

Copy link
Copy Markdown
Collaborator

Summary

  • avoid caching a generic protocol mismatch as universally incompatible when an overloaded method fails to bind
  • preserve broad negative caching for other protocol mismatches
  • add regression coverage for order-dependent overload resolution

Fixes #11644

Tests

  • npx jest typeEvaluator7.test --forceExit --runInBand
  • npm run build
  • ESLint and Prettier checks for changed TypeScript files

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

This comment has been minimized.

@heejaechang

Copy link
Copy Markdown
Collaborator

🔒 Automated review in progress — Heejae Chang (@heejaechang) is auto-reviewing this PR.

Comment thread packages/pyright-internal/src/analyzer/protocols.ts

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved via Review Center.

@heejaechang Heejae Chang (heejaechang) added the review-auto:approved Automated review: no blocking findings (approval posted). label Aug 17, 2026
@rchiodo

Copy link
Copy Markdown
Collaborator Author

Please address Heejae's comment.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

Diff from mypy_primer, showing the effect of this PR on open source code:

sympy (https://github.com/sympy/sympy)
-   .../projects/sympy/sympy/solvers/ode/nonhomogeneous.py:468:28 - error: Argument of type "Expr | Unknown | None" cannot be assigned to parameter "expr" of type "Expr" in function "make_args"
+   .../projects/sympy/sympy/solvers/ode/nonhomogeneous.py:468:28 - error: Argument of type "Unknown | None" cannot be assigned to parameter "expr" of type "Expr" in function "make_args"
-     Type "Expr | Unknown | None" is not assignable to type "Expr"
+     Type "Unknown | None" is not assignable to type "Expr"
-     Attribute "pop" is unknown (reportAttributeAccessIssue)
-   .../projects/sympy/sympy/solvers/ode/ode.py:610:22 - error: Cannot access attribute "pop" for class "tuple[()]"
-     Attribute "pop" is unknown (reportAttributeAccessIssue)
-   .../projects/sympy/sympy/solvers/ode/ode.py:610:22 - error: Cannot access attribute "pop" for class "tuple[str, ...]"
-   .../projects/sympy/sympy/solvers/ode/ode.py:1579:38 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1580:38 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1590:9 - error: No overloads for "update" match the provided arguments (reportCallIssue)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1590:12 - error: "update" is not a known attribute of "None" (reportOptionalMemberAccess)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1590:19 - error: Argument of type "Unknown | dict[Unknown, Unknown] | None" cannot be assigned to parameter "m" of type "Iterable[tuple[str, Unknown]]" in function "update"
-     Type "Unknown | dict[Unknown, Unknown] | None" is not assignable to type "Iterable[tuple[str, Unknown]]"
-       "None" is incompatible with protocol "Iterable[tuple[str, Unknown]]"
-         "__iter__" is not present (reportArgumentType)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1597:43 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1597:64 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1603:9 - error: No overloads for "update" match the provided arguments (reportCallIssue)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1603:12 - error: "update" is not a known attribute of "None" (reportOptionalMemberAccess)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1603:19 - error: Argument of type "Unknown | dict[Unknown, Unknown] | None" cannot be assigned to parameter "m" of type "Iterable[tuple[str, Unknown]]" in function "update"
-     Type "Unknown | dict[Unknown, Unknown] | None" is not assignable to type "Iterable[tuple[str, Unknown]]"
-       "None" is incompatible with protocol "Iterable[tuple[str, Unknown]]"
-         "__iter__" is not present (reportArgumentType)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1610:43 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1610:74 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1616:9 - error: No overloads for "update" match the provided arguments (reportCallIssue)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1616:12 - error: "update" is not a known attribute of "None" (reportOptionalMemberAccess)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1616:19 - error: Argument of type "Unknown | dict[Unknown, Unknown] | None" cannot be assigned to parameter "m" of type "Iterable[tuple[str, Unknown]]" in function "update"
-     Type "Unknown | dict[Unknown, Unknown] | None" is not assignable to type "Iterable[tuple[str, Unknown]]"
-       "None" is incompatible with protocol "Iterable[tuple[str, Unknown]]"
-         "__iter__" is not present (reportArgumentType)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1623:49 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1623:70 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
+   .../projects/sympy/sympy/solvers/ode/ode.py:1753:36 - error: Cannot access attribute "lhs" for class "Expr"
+     Attribute "lhs" is unknown (reportAttributeAccessIssue)
+   .../projects/sympy/sympy/solvers/ode/ode.py:1753:55 - error: Cannot access attribute "rhs" for class "Expr"
+     Attribute "rhs" is unknown (reportAttributeAccessIssue)
+   .../projects/sympy/sympy/solvers/ode/ode.py:1754:36 - error: Cannot access attribute "lhs" for class "Expr"
+     Attribute "lhs" is unknown (reportAttributeAccessIssue)
+   .../projects/sympy/sympy/solvers/ode/ode.py:1755:17 - error: No overloads for "__setitem__" match the provided arguments (reportCallIssue)
+   .../projects/sympy/sympy/solvers/ode/ode.py:1755:17 - error: Argument of type "Equality | BooleanFalse | BooleanTrue | Unknown | Expr" cannot be assigned to parameter "value" of type "Equality | BooleanFalse | BooleanTrue" in function "__setitem__"
+     Type "Equality | BooleanFalse | BooleanTrue | Unknown | Expr" is not assignable to type "Equality | BooleanFalse | BooleanTrue"
+       Type "Expr" is not assignable to type "Equality | BooleanFalse | BooleanTrue"
+         "Expr" is not assignable to "Equality"
+         "Expr" is not assignable to "BooleanFalse"
+         "Expr" is not assignable to "BooleanTrue" (reportArgumentType)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3442:7 - error: "update" is not a known attribute of "None" (reportOptionalMemberAccess)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3442:38 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3443:7 - error: "update" is not a known attribute of "None" (reportOptionalMemberAccess)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3443:38 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3444:14 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3445:14 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3446:14 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3458:50 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3459:50 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3460:50 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3500:5 - error: No overloads for "update" match the provided arguments (reportCallIssue)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3500:7 - error: "update" is not a known attribute of "None" (reportOptionalMemberAccess)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3500:14 - error: Argument of type "Unknown | dict[Unknown, Unknown] | None" cannot be assigned to parameter "m" of type "Iterable[tuple[str, Unknown]]" in function "update"
-     Type "Unknown | dict[Unknown, Unknown] | None" is not assignable to type "Iterable[tuple[str, Unknown]]"
-       "None" is incompatible with protocol "Iterable[tuple[str, Unknown]]"
-         "__iter__" is not present (reportArgumentType)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3501:18 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3501:43 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3502:9 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3502:16 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3502:24 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3502:31 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3503:9 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3503:15 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3503:23 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3503:30 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3504:7 - error: "update" is not a known attribute of "None" (reportOptionalMemberAccess)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3504:46 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3504:54 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3505:9 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3505:19 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3505:29 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3506:10 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)

... (truncated 327 lines) ...

pandas-stubs (https://github.com/pandas-dev/pandas-stubs)
- .../projects/pandas-stubs/tests/indexes/bool/test_add.py
-   .../projects/pandas-stubs/tests/indexes/bool/test_add.py:21:23 - error: "assert_type" mismatch: expected "Index[bool]" but received "Index[int]" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/bool/test_add.py:26:23 - error: "assert_type" mismatch: expected "Index[bool]" but received "Index[int]" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/bool/test_add.py:36:23 - error: "assert_type" mismatch: expected "Index[bool]" but received "Index[int]" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/bool/test_add.py:41:23 - error: "assert_type" mismatch: expected "Index[bool]" but received "Index[int]" (reportAssertTypeFailure)
- .../projects/pandas-stubs/tests/indexes/bool/test_mul.py
-   .../projects/pandas-stubs/tests/indexes/bool/test_mul.py:39:23 - error: "assert_type" mismatch: expected "Index[bool]" but received "Index[int]" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/bool/test_mul.py:47:23 - error: "assert_type" mismatch: expected "Index[bool]" but received "Index[int]" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/bool/test_mul.py:62:23 - error: "assert_type" mismatch: expected "Index[bool]" but received "Index[int]" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/bool/test_mul.py:70:23 - error: "assert_type" mismatch: expected "Index[bool]" but received "Index[int]" (reportAssertTypeFailure)
- .../projects/pandas-stubs/tests/indexes/complex/test_add.py
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:21:23 - error: Operator "+" not supported for types "Index[complex]" and "Literal[True]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:21:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:22:23 - error: Operator "+" not supported for types "Index[complex]" and "Literal[1]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:22:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:23:23 - error: Operator "+" not supported for types "Index[complex]" and "float" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:23:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:26:23 - error: Operator "+" not supported for types "Literal[True]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:26:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:27:23 - error: Operator "+" not supported for types "Literal[1]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:27:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:28:23 - error: Operator "+" not supported for types "float" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:28:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:36:23 - error: Operator "+" not supported for types "Index[complex]" and "list[bool]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:36:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:37:23 - error: Operator "+" not supported for types "Index[complex]" and "list[int]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:37:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:38:23 - error: Operator "+" not supported for types "Index[complex]" and "list[float]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:38:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:41:23 - error: Operator "+" not supported for types "list[bool]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:41:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:42:23 - error: Operator "+" not supported for types "list[int]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:42:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:43:23 - error: Operator "+" not supported for types "list[float]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:43:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
- .../projects/pandas-stubs/tests/indexes/complex/test_mul.py
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:39:23 - error: Operator "*" not supported for types "Index[complex]" and "Literal[True]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:39:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:40:23 - error: Operator "*" not supported for types "Index[complex]" and "Literal[1]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:40:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:41:23 - error: Operator "*" not supported for types "Index[complex]" and "float" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:41:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:47:23 - error: Operator "*" not supported for types "Literal[True]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:47:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:48:23 - error: Operator "*" not supported for types "Literal[1]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:48:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:49:23 - error: Operator "*" not supported for types "float" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:49:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:62:23 - error: Operator "*" not supported for types "Index[complex]" and "list[bool]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:62:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:63:23 - error: Operator "*" not supported for types "Index[complex]" and "list[int]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:63:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:64:23 - error: Operator "*" not supported for types "Index[complex]" and "list[float]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:64:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:70:23 - error: Operator "*" not supported for types "list[bool]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:70:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:71:23 - error: Operator "*" not supported for types "list[int]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:71:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:72:23 - error: Operator "*" not supported for types "list[float]" and "Index[complex]" (reportOperatorIssue)

... (truncated 61 lines) ...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review-auto:approved Automated review: no blocking findings (approval posted).

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Order-dependent overload resolution failure due to memorised Protocol conformance check on generic class

2 participants