diff --git a/pyrefly/lib/alt/class/class_field.rs b/pyrefly/lib/alt/class/class_field.rs index 1d77b01f8d..12d1fa12ca 100644 --- a/pyrefly/lib/alt/class/class_field.rs +++ b/pyrefly/lib/alt/class/class_field.rs @@ -4100,6 +4100,13 @@ impl<'ctx, 'answer, Ans: LookupAnswer> AnswersSolver<'ctx, 'answer, Ans> { if cls.module_path().is_interface() { return; } + if class_field + .ty() + .toplevel_func_metadata() + .is_some_and(|meta| meta.flags.is_in_type_checking_block) + { + return; + } // If any base derives from `Any`, we can't reliably tell whether the method // overrides a concrete parent method, so suppress the check. Gather this // across all bases first so the decision is independent of base order. diff --git a/pyrefly/lib/test/class_overrides.rs b/pyrefly/lib/test/class_overrides.rs index 645b7503e5..15ba99a15b 100644 --- a/pyrefly/lib/test/class_overrides.rs +++ b/pyrefly/lib/test/class_overrides.rs @@ -2338,6 +2338,23 @@ from stub import C, D "#, ); +testcase!( + test_missing_super_call_in_type_checking_block, + TestEnv::new().enable_missing_super_call_error(), + r#" +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + class Foo: + def __init__(self) -> None: + ... + + class Bar(Foo): + def __init__(self) -> None: + ... + "#, +); + testcase!( test_override_descriptor_method, r#"