From 5a25daa5124606e3973265c6f6f9757a3c366cdc Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Fri, 25 Aug 2023 18:08:29 +0100 Subject: [PATCH] gh-104504: Cases generator: enable mypy's `possibly-undefined` error code (#108454) --- Tools/cases_generator/generate_cases.py | 13 +++++++++---- Tools/cases_generator/mypy.ini | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Tools/cases_generator/generate_cases.py b/Tools/cases_generator/generate_cases.py index 9400a0bce462c8..f89572fc496a70 100644 --- a/Tools/cases_generator/generate_cases.py +++ b/Tools/cases_generator/generate_cases.py @@ -156,6 +156,8 @@ def effect_str(effects: list[StackEffect]) -> str: return str(n_effect) instr: AnyInstruction | None + popped: str | None = None + pushed: str | None = None match thing: case parsing.InstDef(): if thing.kind != "op" or self.instrs[thing.name].is_viable_uop(): @@ -173,7 +175,7 @@ def effect_str(effects: list[StackEffect]) -> str: instr = self.pseudo_instrs[thing.name] # Calculate stack effect, and check that it's the the same # for all targets. - for idx, target in enumerate(self.pseudos[thing.name].targets): + for target in self.pseudos[thing.name].targets: target_instr = self.instrs.get(target) # Currently target is always an instr. This could change # in the future, e.g., if we have a pseudo targetting a @@ -181,13 +183,14 @@ def effect_str(effects: list[StackEffect]) -> str: assert target_instr target_popped = effect_str(target_instr.input_effects) target_pushed = effect_str(target_instr.output_effects) - if idx == 0: + if popped is None: popped, pushed = target_popped, target_pushed else: assert popped == target_popped assert pushed == target_pushed case _: assert_never(thing) + assert popped is not None and pushed is not None return instr, popped, pushed @contextlib.contextmanager @@ -376,6 +379,7 @@ def write_metadata(self, metadata_filename: str, pymetadata_filename: str) -> No # Compute the set of all instruction formats. all_formats: set[str] = set() for thing in self.everything: + format: str | None = None match thing: case OverriddenInstructionPlaceHolder(): continue @@ -384,15 +388,16 @@ def write_metadata(self, metadata_filename: str, pymetadata_filename: str) -> No case parsing.Macro(): format = self.macro_instrs[thing.name].instr_fmt case parsing.Pseudo(): - for idx, target in enumerate(self.pseudos[thing.name].targets): + for target in self.pseudos[thing.name].targets: target_instr = self.instrs.get(target) assert target_instr - if idx == 0: + if format is None: format = target_instr.instr_fmt else: assert format == target_instr.instr_fmt case _: assert_never(thing) + assert format is not None all_formats.add(format) # Turn it into a sorted list of enum values. diff --git a/Tools/cases_generator/mypy.ini b/Tools/cases_generator/mypy.ini index 54ccb8c5c1a3a2..e7175e263350b2 100644 --- a/Tools/cases_generator/mypy.ini +++ b/Tools/cases_generator/mypy.ini @@ -9,5 +9,5 @@ python_version = 3.10 # ...And be strict: strict = True strict_concatenate = True -enable_error_code = ignore-without-code,redundant-expr,truthy-bool +enable_error_code = ignore-without-code,redundant-expr,truthy-bool,possibly-undefined warn_unreachable = True