[llvm] [mlir] [MLIR][Python] add mypy tests (PR #157569)

Maksim Levental via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 8 15:51:34 PDT 2025


https://github.com/makslevental updated https://github.com/llvm/llvm-project/pull/157569

>From 2a8bb7b324d8d5332551051856a3768fdd4b3432 Mon Sep 17 00:00:00 2001
From: makslevental <maksim.levental at gmail.com>
Date: Mon, 8 Sep 2025 15:20:29 -0700
Subject: [PATCH] [MLIR][Python] add mypy tests

---
 .ci/all_requirements.txt                      | 86 ++++++++++++++++++-
 mlir/python/CMakeLists.txt                    |  3 +
 mlir/python/mlir/__init__.py                  |  1 +
 mlir/python/mlir/dialects/__init__.py         |  1 +
 mlir/python/mlir/py.typed                     |  0
 mlir/python/requirements.txt                  |  1 +
 mlir/test/lit.cfg.py                          |  7 ++
 mlir/test/python/bindings_type_stubs.py       |  1 +
 mlir/test/python/dialects/affine.py           |  1 +
 mlir/test/python/dialects/amdgpu.py           |  1 +
 mlir/test/python/dialects/arith_dialect.py    |  1 +
 mlir/test/python/dialects/arith_llvm.py       |  1 +
 mlir/test/python/dialects/async_dialect.py    |  1 +
 mlir/test/python/dialects/builtin.py          |  1 +
 mlir/test/python/dialects/cf.py               |  1 +
 mlir/test/python/dialects/complex_dialect.py  |  1 +
 mlir/test/python/dialects/emitc_dialect.py    |  1 +
 mlir/test/python/dialects/func.py             |  1 +
 mlir/test/python/dialects/gpu/dialect.py      |  1 +
 .../dialects/gpu/module-to-binary-nvvm.py     |  1 +
 .../dialects/gpu/module-to-binary-rocdl.py    |  1 +
 mlir/test/python/dialects/index_dialect.py    |  1 +
 .../python/dialects/linalg/opdsl/doctests.py  |  1 +
 .../dialects/linalg/opdsl/emit_convolution.py |  1 +
 .../python/dialects/linalg/opdsl/emit_fill.py |  1 +
 .../dialects/linalg/opdsl/emit_matmul.py      |  1 +
 .../python/dialects/linalg/opdsl/emit_misc.py |  1 +
 .../dialects/linalg/opdsl/emit_pooling.py     |  1 +
 mlir/test/python/dialects/linalg/ops.py       |  1 +
 mlir/test/python/dialects/linalg/utils.py     |  1 +
 mlir/test/python/dialects/llvm.py             |  1 +
 mlir/test/python/dialects/math_dialect.py     |  1 +
 mlir/test/python/dialects/memref.py           |  1 +
 mlir/test/python/dialects/ml_program.py       |  1 +
 mlir/test/python/dialects/nvgpu.py            |  1 +
 mlir/test/python/dialects/nvvm.py             |  1 +
 mlir/test/python/dialects/ods_helpers.py      |  1 +
 mlir/test/python/dialects/openmp_ops.py       |  1 +
 mlir/test/python/dialects/pdl_ops.py          |  1 +
 mlir/test/python/dialects/pdl_types.py        |  1 +
 mlir/test/python/dialects/python_test.py      |  1 +
 mlir/test/python/dialects/quant.py            |  1 +
 mlir/test/python/dialects/rocdl.py            |  1 +
 mlir/test/python/dialects/scf.py              |  1 +
 mlir/test/python/dialects/shape.py            |  1 +
 mlir/test/python/dialects/smt.py              |  1 +
 .../python/dialects/sparse_tensor/dialect.py  |  1 +
 .../python/dialects/sparse_tensor/passes.py   |  1 +
 mlir/test/python/dialects/spirv_dialect.py    |  1 +
 mlir/test/python/dialects/tensor.py           |  1 +
 mlir/test/python/dialects/tosa.py             |  1 +
 mlir/test/python/dialects/transform.py        |  1 +
 .../dialects/transform_bufferization_ext.py   |  1 +
 .../python/dialects/transform_debug_ext.py    |  1 +
 mlir/test/python/dialects/transform_extras.py |  1 +
 .../test/python/dialects/transform_gpu_ext.py |  1 +
 .../python/dialects/transform_interpreter.py  |  1 +
 .../python/dialects/transform_loop_ext.py     |  1 +
 .../python/dialects/transform_memref_ext.py   |  1 +
 .../python/dialects/transform_nvgpu_ext.py    |  1 +
 .../dialects/transform_sparse_tensor_ext.py   |  1 +
 .../dialects/transform_structured_ext.py      |  1 +
 .../python/dialects/transform_tensor_ext.py   |  1 +
 .../python/dialects/transform_tune_ext.py     |  1 +
 .../python/dialects/transform_vector_ext.py   |  1 +
 mlir/test/python/dialects/ub.py               |  1 +
 mlir/test/python/dialects/vector.py           |  1 +
 mlir/test/python/execution_engine.py          |  1 +
 mlir/test/python/global_constructors.py       |  1 +
 .../integration/dialects/linalg/opsrun.py     |  1 +
 mlir/test/python/integration/dialects/pdl.py  |  1 +
 .../python/integration/dialects/transform.py  |  1 +
 mlir/test/python/ir/affine_expr.py            |  1 +
 mlir/test/python/ir/affine_map.py             |  1 +
 mlir/test/python/ir/array_attributes.py       |  1 +
 mlir/test/python/ir/attributes.py             |  1 +
 mlir/test/python/ir/auto_location.py          |  1 +
 mlir/test/python/ir/blocks.py                 |  1 +
 mlir/test/python/ir/builtin_types.py          |  1 +
 mlir/test/python/ir/context_lifecycle.py      |  1 +
 mlir/test/python/ir/context_managers.py       |  1 +
 mlir/test/python/ir/debug.py                  |  1 +
 mlir/test/python/ir/diagnostic_handler.py     |  1 +
 mlir/test/python/ir/dialects.py               |  1 +
 mlir/test/python/ir/exception.py              |  1 +
 mlir/test/python/ir/insertion_point.py        |  1 +
 mlir/test/python/ir/integer_set.py            |  1 +
 mlir/test/python/ir/location.py               |  1 +
 mlir/test/python/ir/module.py                 |  1 +
 mlir/test/python/ir/operation.py              |  1 +
 mlir/test/python/ir/symbol_table.py           |  1 +
 mlir/test/python/ir/value.py                  |  1 +
 mlir/test/python/live_operations.py           |  1 +
 mlir/test/python/multithreaded_tests.py       |  1 +
 mlir/test/python/mypy.ini                     |  3 +
 mlir/test/python/pass_manager.py              |  1 +
 96 files changed, 189 insertions(+), 1 deletion(-)
 create mode 100644 mlir/python/mlir/__init__.py
 create mode 100644 mlir/python/mlir/dialects/__init__.py
 create mode 100644 mlir/python/mlir/py.typed
 create mode 100644 mlir/test/python/bindings_type_stubs.py
 create mode 100644 mlir/test/python/mypy.ini

diff --git a/.ci/all_requirements.txt b/.ci/all_requirements.txt
index ac9682a09bec1..87d88b15fe6d1 100644
--- a/.ci/all_requirements.txt
+++ b/.ci/all_requirements.txt
@@ -194,6 +194,50 @@ ml-dtypes==0.5.1 ; python_version < "3.13" \
     --hash=sha256:d13755f8e8445b3870114e5b6240facaa7cb0c3361e54beba3e07fa912a6e12b \
     --hash=sha256:fd918d4e6a4e0c110e2e05be7a7814d10dc1b95872accbf6512b80a109b71ae1
     # via -r mlir/python/requirements.txt
+mypy==1.17.1 \
+    --hash=sha256:03b6d0ed2b188e35ee6d5c36b5580cffd6da23319991c49ab5556c023ccf1341 \
+    --hash=sha256:064e2ff508e5464b4bd807a7c1625bc5047c5022b85c70f030680e18f37273a5 \
+    --hash=sha256:099b9a5da47de9e2cb5165e581f158e854d9e19d2e96b6698c0d64de911dd849 \
+    --hash=sha256:15a83369400454c41ed3a118e0cc58bd8123921a602f385cb6d6ea5df050c733 \
+    --hash=sha256:15d54056f7fe7a826d897789f53dd6377ec2ea8ba6f776dc83c2902b899fee81 \
+    --hash=sha256:1b16708a66d38abb1e6b5702f5c2c87e133289da36f6a1d15f6a5221085c6403 \
+    --hash=sha256:209a58fed9987eccc20f2ca94afe7257a8f46eb5df1fb69958650973230f91e6 \
+    --hash=sha256:25e01ec741ab5bb3eec8ba9cdb0f769230368a22c959c4937360efb89b7e9f01 \
+    --hash=sha256:397fba5d7616a5bc60b45c7ed204717eaddc38f826e3645402c426057ead9a91 \
+    --hash=sha256:3fbe6d5555bf608c47203baa3e72dbc6ec9965b3d7c318aa9a4ca76f465bd972 \
+    --hash=sha256:43808d9476c36b927fbcd0b0255ce75efe1b68a080154a38ae68a7e62de8f0f8 \
+    --hash=sha256:55b918670f692fc9fba55c3298d8a3beae295c5cded0a55dccdc5bbead814acd \
+    --hash=sha256:5d1092694f166a7e56c805caaf794e0585cabdbf1df36911c414e4e9abb62ae9 \
+    --hash=sha256:62761474061feef6f720149d7ba876122007ddc64adff5ba6f374fda35a018a0 \
+    --hash=sha256:665afab0963a4b39dff7c1fa563cc8b11ecff7910206db4b2e64dd1ba25aed19 \
+    --hash=sha256:69e83ea6553a3ba79c08c6e15dbd9bfa912ec1e493bf75489ef93beb65209aeb \
+    --hash=sha256:70401bbabd2fa1aa7c43bb358f54037baf0586f41e83b0ae67dd0534fc64edfd \
+    --hash=sha256:79d44f9bfb004941ebb0abe8eff6504223a9c1ac51ef967d1263c6572bbebc99 \
+    --hash=sha256:80ef5c058b7bce08c83cac668158cb7edea692e458d21098c7d3bce35a5d43e7 \
+    --hash=sha256:89e972c0035e9e05823907ad5398c5a73b9f47a002b22359b177d40bdaee7056 \
+    --hash=sha256:93378d3203a5c0800c6b6d850ad2f19f7a3cdf1a3701d3416dbf128805c6a6a7 \
+    --hash=sha256:9a2b7d9180aed171f033c9f2fc6c204c1245cf60b0cb61cf2e7acc24eea78e0a \
+    --hash=sha256:9d6b20b97d373f41617bd0708fd46aa656059af57f2ef72aa8c7d6a2b73b74ed \
+    --hash=sha256:a76906f26bd8d51ea9504966a9c25419f2e668f012e0bdf3da4ea1526c534d94 \
+    --hash=sha256:a9f52c0351c21fe24c21d8c0eb1f62967b262d6729393397b6f443c3b773c3b9 \
+    --hash=sha256:ad37544be07c5d7fba814eb370e006df58fed8ad1ef33ed1649cb1889ba6ff58 \
+    --hash=sha256:b01586eed696ec905e61bd2568f48740f7ac4a45b3a468e6423a03d3788a51a8 \
+    --hash=sha256:c1fdf4abb29ed1cb091cf432979e162c208a5ac676ce35010373ff29247bcad5 \
+    --hash=sha256:c49562d3d908fd49ed0938e5423daed8d407774a479b595b143a3d7f87cdae6a \
+    --hash=sha256:c4a580f8a70c69e4a75587bd925d298434057fe2a428faaf927ffe6e4b9a98df \
+    --hash=sha256:c837b896b37cd103570d776bda106eabb8737aa6dd4f248451aecf53030cdbeb \
+    --hash=sha256:d7598cf74c3e16539d4e2f0b8d8c318e00041553d83d4861f87c7a72e95ac24d \
+    --hash=sha256:dd86bb649299f09d987a2eebb4d52d10603224500792e1bee18303bbcc1ce390 \
+    --hash=sha256:e79311f2d904ccb59787477b7bd5d26f3347789c06fcd7656fa500875290264b \
+    --hash=sha256:e92bdc656b7757c438660f775f872a669b8ff374edc4d18277d86b63edba6b8b \
+    --hash=sha256:fa6ffadfbe6994d724c5a1bb6123a7d27dd68fc9c059561cd33b664a79578e14 \
+    --hash=sha256:feb8cc32d319edd5859da2cc084493b3e2ce5e49a946377663cc90f6c15fb259 \
+    --hash=sha256:ff2933428516ab63f961644bc49bc4cbe42bbffb2cd3b71cc7277c07d16b1a8b
+    # via -r mlir/python/requirements.txt
+mypy-extensions==1.1.0 \
+    --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \
+    --hash=sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558
+    # via mypy
 nanobind==2.9.2 \
     --hash=sha256:c37957ffd5eac7eda349cff3622ecd32e5ee1244ecc912c99b5bc8188bafd16e \
     --hash=sha256:e7608472de99d375759814cab3e2c94aba3f9ec80e62cfef8ced495ca5c27d6e
@@ -251,6 +295,10 @@ packaging==25.0 \
     --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 \
     --hash=sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f
     # via -r lldb/test/requirements.txt
+pathspec==0.12.1 \
+    --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \
+    --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712
+    # via mypy
 pexpect==4.9.0 ; sys_platform != "win32" \
     --hash=sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 \
     --hash=sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f
@@ -383,10 +431,46 @@ swig==4.3.1 \
     --hash=sha256:efec16327029f682f649a26da726bb0305be8800bd0f1fa3e81bf0769cf5b476 \
     --hash=sha256:fc496c0d600cf1bb2d91e28d3d6eae9c4301e5ea7a0dec5a4281b5efed4245a8
     # via -r lldb/test/requirements.txt
+tomli==2.2.1 \
+    --hash=sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6 \
+    --hash=sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd \
+    --hash=sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c \
+    --hash=sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b \
+    --hash=sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8 \
+    --hash=sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6 \
+    --hash=sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77 \
+    --hash=sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff \
+    --hash=sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea \
+    --hash=sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192 \
+    --hash=sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249 \
+    --hash=sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee \
+    --hash=sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4 \
+    --hash=sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98 \
+    --hash=sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8 \
+    --hash=sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4 \
+    --hash=sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281 \
+    --hash=sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744 \
+    --hash=sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69 \
+    --hash=sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13 \
+    --hash=sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140 \
+    --hash=sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e \
+    --hash=sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e \
+    --hash=sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc \
+    --hash=sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff \
+    --hash=sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec \
+    --hash=sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2 \
+    --hash=sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222 \
+    --hash=sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106 \
+    --hash=sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272 \
+    --hash=sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a \
+    --hash=sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7
+    # via mypy
 typing-extensions==4.15.0 \
     --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \
     --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548
-    # via -r mlir/python/requirements.txt
+    # via
+    #   -r mlir/python/requirements.txt
+    #   mypy
 urllib3==2.5.0 \
     --hash=sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760 \
     --hash=sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc
diff --git a/mlir/python/CMakeLists.txt b/mlir/python/CMakeLists.txt
index a058cf926abdc..1853c1578d78e 100644
--- a/mlir/python/CMakeLists.txt
+++ b/mlir/python/CMakeLists.txt
@@ -23,10 +23,13 @@ declare_mlir_python_sources(MLIRPythonSources.Core.Python
   ADD_TO_PARENT MLIRPythonSources.Core
   SOURCES
     _mlir_libs/__init__.py
+    __init__.py
     ir.py
     passmanager.py
     rewrite.py
     dialects/_ods_common.py
+    dialects/__init__.py
+    py.typed
 )
 
 declare_mlir_python_sources(MLIRPythonSources.Core.Python.Extras
diff --git a/mlir/python/mlir/__init__.py b/mlir/python/mlir/__init__.py
new file mode 100644
index 0000000000000..69e3be50dac40
--- /dev/null
+++ b/mlir/python/mlir/__init__.py
@@ -0,0 +1 @@
+__path__ = __import__('pkgutil').extend_path(__path__, __name__)
diff --git a/mlir/python/mlir/dialects/__init__.py b/mlir/python/mlir/dialects/__init__.py
new file mode 100644
index 0000000000000..69e3be50dac40
--- /dev/null
+++ b/mlir/python/mlir/dialects/__init__.py
@@ -0,0 +1 @@
+__path__ = __import__('pkgutil').extend_path(__path__, __name__)
diff --git a/mlir/python/mlir/py.typed b/mlir/python/mlir/py.typed
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/mlir/python/requirements.txt b/mlir/python/requirements.txt
index abe09259bb1e8..841a9fe3a0aec 100644
--- a/mlir/python/requirements.txt
+++ b/mlir/python/requirements.txt
@@ -5,3 +5,4 @@ PyYAML>=5.4.0, <=6.0.1
 ml_dtypes>=0.1.0, <=0.6.0; python_version<"3.13"   # provides several NumPy dtype extensions, including the bf16
 ml_dtypes>=0.5.0, <=0.6.0; python_version>="3.13"
 typing_extensions>=4.12.2
+mypy>=1.17.1
diff --git a/mlir/test/lit.cfg.py b/mlir/test/lit.cfg.py
index f99c24d6e299a..c2dd1d3684607 100644
--- a/mlir/test/lit.cfg.py
+++ b/mlir/test/lit.cfg.py
@@ -57,6 +57,12 @@
 config.substitutions.append(("%shlibext", config.llvm_shlib_ext))
 config.substitutions.append(("%llvm_src_root", config.llvm_src_root))
 config.substitutions.append(("%mlir_src_root", config.mlir_src_root))
+config.substitutions.append(
+    (
+        "%mlir_python_packages_root",
+        os.path.join(config.mlir_obj_root, "python_packages", "mlir_core"),
+    )
+)
 config.substitutions.append(("%host_cxx", config.host_cxx.strip()))
 config.substitutions.append(("%host_cc", config.host_cc.strip()))
 
@@ -348,6 +354,7 @@ def find_real_python_interpreter():
 else:
     config.available_features.add("noasserts")
 
+
 def have_host_jit_feature_support(feature_name):
     mlir_runner_exe = lit.util.which("mlir-runner", config.mlir_tools_dir)
 
diff --git a/mlir/test/python/bindings_type_stubs.py b/mlir/test/python/bindings_type_stubs.py
new file mode 100644
index 0000000000000..7c83e9f5dd989
--- /dev/null
+++ b/mlir/test/python/bindings_type_stubs.py
@@ -0,0 +1 @@
+# RUN: %PYTHON -m mypy %mlir_python_packages_root --config-file %mlir_src_root/test/python/mypy.ini
diff --git a/mlir/test/python/dialects/affine.py b/mlir/test/python/dialects/affine.py
index 7ef128c1724c4..dfaf69d064c89 100644
--- a/mlir/test/python/dialects/affine.py
+++ b/mlir/test/python/dialects/affine.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import func
diff --git a/mlir/test/python/dialects/amdgpu.py b/mlir/test/python/dialects/amdgpu.py
index b479576dac093..e63c0b3b83e8f 100644
--- a/mlir/test/python/dialects/amdgpu.py
+++ b/mlir/test/python/dialects/amdgpu.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 # This is just a smoke test that the dialect is functional.
 
 from mlir.ir import *
diff --git a/mlir/test/python/dialects/arith_dialect.py b/mlir/test/python/dialects/arith_dialect.py
index c9af5e7b46db8..e1298188c94a9 100644
--- a/mlir/test/python/dialects/arith_dialect.py
+++ b/mlir/test/python/dialects/arith_dialect.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 from functools import partialmethod
 
 from mlir.ir import *
diff --git a/mlir/test/python/dialects/arith_llvm.py b/mlir/test/python/dialects/arith_llvm.py
index 5645330f3174e..e2df3c2770cf2 100644
--- a/mlir/test/python/dialects/arith_llvm.py
+++ b/mlir/test/python/dialects/arith_llvm.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 from functools import partialmethod
 
 from mlir.ir import *
diff --git a/mlir/test/python/dialects/async_dialect.py b/mlir/test/python/dialects/async_dialect.py
index 13e3c42e57c21..f3296d7ac0752 100644
--- a/mlir/test/python/dialects/async_dialect.py
+++ b/mlir/test/python/dialects/async_dialect.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import arith
diff --git a/mlir/test/python/dialects/builtin.py b/mlir/test/python/dialects/builtin.py
index 973a0eaeca2cd..1cf948ac29f20 100644
--- a/mlir/test/python/dialects/builtin.py
+++ b/mlir/test/python/dialects/builtin.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 import mlir.dialects.builtin as builtin
diff --git a/mlir/test/python/dialects/cf.py b/mlir/test/python/dialects/cf.py
index 469e74d44a7da..2292bd17b5750 100644
--- a/mlir/test/python/dialects/cf.py
+++ b/mlir/test/python/dialects/cf.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import cf
diff --git a/mlir/test/python/dialects/complex_dialect.py b/mlir/test/python/dialects/complex_dialect.py
index afad21757bc3c..3dd3cbc60c4d5 100644
--- a/mlir/test/python/dialects/complex_dialect.py
+++ b/mlir/test/python/dialects/complex_dialect.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 # Naming this file with a `_dialect` suffix to avoid a naming conflict with
 # python package's math module (coming in from random.py).
diff --git a/mlir/test/python/dialects/emitc_dialect.py b/mlir/test/python/dialects/emitc_dialect.py
index 0c42c2d4084f1..35ac7e445c490 100644
--- a/mlir/test/python/dialects/emitc_dialect.py
+++ b/mlir/test/python/dialects/emitc_dialect.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 import mlir.dialects.emitc as emitc
diff --git a/mlir/test/python/dialects/func.py b/mlir/test/python/dialects/func.py
index 6b3932ce64f13..0bab9e0a0027c 100644
--- a/mlir/test/python/dialects/func.py
+++ b/mlir/test/python/dialects/func.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import arith
diff --git a/mlir/test/python/dialects/gpu/dialect.py b/mlir/test/python/dialects/gpu/dialect.py
index 26ee9f34cb332..98fc4ce404219 100644
--- a/mlir/test/python/dialects/gpu/dialect.py
+++ b/mlir/test/python/dialects/gpu/dialect.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 import mlir.dialects.gpu as gpu
diff --git a/mlir/test/python/dialects/gpu/module-to-binary-nvvm.py b/mlir/test/python/dialects/gpu/module-to-binary-nvvm.py
index 96e3f6efcc5d3..17086a54f5fc1 100644
--- a/mlir/test/python/dialects/gpu/module-to-binary-nvvm.py
+++ b/mlir/test/python/dialects/gpu/module-to-binary-nvvm.py
@@ -1,5 +1,6 @@
 # REQUIRES: host-supports-nvptx
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 import mlir.dialects.gpu as gpu
diff --git a/mlir/test/python/dialects/gpu/module-to-binary-rocdl.py b/mlir/test/python/dialects/gpu/module-to-binary-rocdl.py
index f5ee2856f3950..7047d41f39469 100644
--- a/mlir/test/python/dialects/gpu/module-to-binary-rocdl.py
+++ b/mlir/test/python/dialects/gpu/module-to-binary-rocdl.py
@@ -1,5 +1,6 @@
 # REQUIRES: host-supports-amdgpu
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 import mlir.dialects.gpu as gpu
diff --git a/mlir/test/python/dialects/index_dialect.py b/mlir/test/python/dialects/index_dialect.py
index 9db883469792c..5c735c29c1dba 100644
--- a/mlir/test/python/dialects/index_dialect.py
+++ b/mlir/test/python/dialects/index_dialect.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import index, arith
diff --git a/mlir/test/python/dialects/linalg/opdsl/doctests.py b/mlir/test/python/dialects/linalg/opdsl/doctests.py
index d2f9cec19d570..5e4d1deeaee5b 100644
--- a/mlir/test/python/dialects/linalg/opdsl/doctests.py
+++ b/mlir/test/python/dialects/linalg/opdsl/doctests.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import doctest
 import importlib
diff --git a/mlir/test/python/dialects/linalg/opdsl/emit_convolution.py b/mlir/test/python/dialects/linalg/opdsl/emit_convolution.py
index d666d313767b9..571527b8d8c63 100644
--- a/mlir/test/python/dialects/linalg/opdsl/emit_convolution.py
+++ b/mlir/test/python/dialects/linalg/opdsl/emit_convolution.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import builtin
diff --git a/mlir/test/python/dialects/linalg/opdsl/emit_fill.py b/mlir/test/python/dialects/linalg/opdsl/emit_fill.py
index ffef737755e85..bc4f809edc60a 100644
--- a/mlir/test/python/dialects/linalg/opdsl/emit_fill.py
+++ b/mlir/test/python/dialects/linalg/opdsl/emit_fill.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import builtin
diff --git a/mlir/test/python/dialects/linalg/opdsl/emit_matmul.py b/mlir/test/python/dialects/linalg/opdsl/emit_matmul.py
index 64df4e1276222..4550707a5c6d0 100644
--- a/mlir/test/python/dialects/linalg/opdsl/emit_matmul.py
+++ b/mlir/test/python/dialects/linalg/opdsl/emit_matmul.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import builtin
diff --git a/mlir/test/python/dialects/linalg/opdsl/emit_misc.py b/mlir/test/python/dialects/linalg/opdsl/emit_misc.py
index f8e034fb0e48b..85d837cc21255 100644
--- a/mlir/test/python/dialects/linalg/opdsl/emit_misc.py
+++ b/mlir/test/python/dialects/linalg/opdsl/emit_misc.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import builtin
diff --git a/mlir/test/python/dialects/linalg/opdsl/emit_pooling.py b/mlir/test/python/dialects/linalg/opdsl/emit_pooling.py
index 4ce0fbc1dbe53..349d353fc4e7b 100644
--- a/mlir/test/python/dialects/linalg/opdsl/emit_pooling.py
+++ b/mlir/test/python/dialects/linalg/opdsl/emit_pooling.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import builtin
diff --git a/mlir/test/python/dialects/linalg/ops.py b/mlir/test/python/dialects/linalg/ops.py
index 709a1d2424f35..34a91adfbcd2d 100644
--- a/mlir/test/python/dialects/linalg/ops.py
+++ b/mlir/test/python/dialects/linalg/ops.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.dialects import arith, func, linalg, tensor, memref
 from mlir.dialects.linalg.opdsl.lang import *
diff --git a/mlir/test/python/dialects/linalg/utils.py b/mlir/test/python/dialects/linalg/utils.py
index 5f7cb6a6c83cb..f19d77cfaac98 100644
--- a/mlir/test/python/dialects/linalg/utils.py
+++ b/mlir/test/python/dialects/linalg/utils.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.dialects import arith, func, linalg
 from mlir.dialects.linalg.opdsl.lang import *
diff --git a/mlir/test/python/dialects/llvm.py b/mlir/test/python/dialects/llvm.py
index d9ffdeb65bfd4..35333987269d5 100644
--- a/mlir/test/python/dialects/llvm.py
+++ b/mlir/test/python/dialects/llvm.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 # This is just a smoke test that the dialect is functional.
 
 from mlir.ir import *
diff --git a/mlir/test/python/dialects/math_dialect.py b/mlir/test/python/dialects/math_dialect.py
index 3d402c54a11e3..1ea8971310468 100644
--- a/mlir/test/python/dialects/math_dialect.py
+++ b/mlir/test/python/dialects/math_dialect.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 # Naming this file with a `_dialect` suffix to avoid a naming conflict with
 # python package's math module (coming in from random.py).
diff --git a/mlir/test/python/dialects/memref.py b/mlir/test/python/dialects/memref.py
index b91fdc367cf30..fd1c720ba0040 100644
--- a/mlir/test/python/dialects/memref.py
+++ b/mlir/test/python/dialects/memref.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import mlir.dialects.arith as arith
 import mlir.dialects.memref as memref
diff --git a/mlir/test/python/dialects/ml_program.py b/mlir/test/python/dialects/ml_program.py
index edffcfbf0138d..9410634fd472e 100644
--- a/mlir/test/python/dialects/ml_program.py
+++ b/mlir/test/python/dialects/ml_program.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 # This is just a smoke test that the dialect is functional.
 
 from mlir.ir import *
diff --git a/mlir/test/python/dialects/nvgpu.py b/mlir/test/python/dialects/nvgpu.py
index 6df32bdd3c273..347e84abe7796 100644
--- a/mlir/test/python/dialects/nvgpu.py
+++ b/mlir/test/python/dialects/nvgpu.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 # This is just a smoke test that the dialect is functional.
 
 from mlir.ir import *
diff --git a/mlir/test/python/dialects/nvvm.py b/mlir/test/python/dialects/nvvm.py
index 3eb62bef50de9..2de61b279e058 100644
--- a/mlir/test/python/dialects/nvvm.py
+++ b/mlir/test/python/dialects/nvvm.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 # This is just a smoke test that the dialect is functional.
 
 from mlir.ir import *
diff --git a/mlir/test/python/dialects/ods_helpers.py b/mlir/test/python/dialects/ods_helpers.py
index 6f02153e08db5..3b6c0e3043c55 100644
--- a/mlir/test/python/dialects/ods_helpers.py
+++ b/mlir/test/python/dialects/ods_helpers.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc
 
diff --git a/mlir/test/python/dialects/openmp_ops.py b/mlir/test/python/dialects/openmp_ops.py
index d136853523402..ce351149355c0 100644
--- a/mlir/test/python/dialects/openmp_ops.py
+++ b/mlir/test/python/dialects/openmp_ops.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects.openmp import *
diff --git a/mlir/test/python/dialects/pdl_ops.py b/mlir/test/python/dialects/pdl_ops.py
index 95cb25c14873d..f0f1ae2841f0c 100644
--- a/mlir/test/python/dialects/pdl_ops.py
+++ b/mlir/test/python/dialects/pdl_ops.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects.pdl import *
diff --git a/mlir/test/python/dialects/pdl_types.py b/mlir/test/python/dialects/pdl_types.py
index 16a41e2a4c1ce..0dfd5d7634796 100644
--- a/mlir/test/python/dialects/pdl_types.py
+++ b/mlir/test/python/dialects/pdl_types.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import pdl
diff --git a/mlir/test/python/dialects/python_test.py b/mlir/test/python/dialects/python_test.py
index 68262822ca6b5..1fd0ab1cc16c2 100644
--- a/mlir/test/python/dialects/python_test.py
+++ b/mlir/test/python/dialects/python_test.py
@@ -1,5 +1,6 @@
 # RUN: %PYTHON %s pybind11 | FileCheck %s
 # RUN: %PYTHON %s nanobind | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import sys
 from mlir.ir import *
diff --git a/mlir/test/python/dialects/quant.py b/mlir/test/python/dialects/quant.py
index 57c528da7b9eb..e199501894669 100644
--- a/mlir/test/python/dialects/quant.py
+++ b/mlir/test/python/dialects/quant.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import numpy as np
 from mlir.ir import *
diff --git a/mlir/test/python/dialects/rocdl.py b/mlir/test/python/dialects/rocdl.py
index a4a50afa966c7..c49224c1d7eb1 100644
--- a/mlir/test/python/dialects/rocdl.py
+++ b/mlir/test/python/dialects/rocdl.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 # This is just a smoke test that the dialect is functional.
 from array import array
 
diff --git a/mlir/test/python/dialects/scf.py b/mlir/test/python/dialects/scf.py
index 62d11d5e189c8..8b0a880c72428 100644
--- a/mlir/test/python/dialects/scf.py
+++ b/mlir/test/python/dialects/scf.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import arith
diff --git a/mlir/test/python/dialects/shape.py b/mlir/test/python/dialects/shape.py
index ad755852f5d37..793d2189ac69b 100644
--- a/mlir/test/python/dialects/shape.py
+++ b/mlir/test/python/dialects/shape.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 import numpy as np
diff --git a/mlir/test/python/dialects/smt.py b/mlir/test/python/dialects/smt.py
index 6f0cd8835b65b..0136b0be0f03d 100644
--- a/mlir/test/python/dialects/smt.py
+++ b/mlir/test/python/dialects/smt.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.dialects import smt, arith
 from mlir.ir import Context, Location, Module, InsertionPoint, F32Type
diff --git a/mlir/test/python/dialects/sparse_tensor/dialect.py b/mlir/test/python/dialects/sparse_tensor/dialect.py
index c72a69830a1e8..7da544ab31922 100644
--- a/mlir/test/python/dialects/sparse_tensor/dialect.py
+++ b/mlir/test/python/dialects/sparse_tensor/dialect.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import sparse_tensor as st, tensor
diff --git a/mlir/test/python/dialects/sparse_tensor/passes.py b/mlir/test/python/dialects/sparse_tensor/passes.py
index c37c5207ebd9f..baba81f538597 100644
--- a/mlir/test/python/dialects/sparse_tensor/passes.py
+++ b/mlir/test/python/dialects/sparse_tensor/passes.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.passmanager import *
diff --git a/mlir/test/python/dialects/spirv_dialect.py b/mlir/test/python/dialects/spirv_dialect.py
index d5b9e6cedb5d3..5394873627713 100644
--- a/mlir/test/python/dialects/spirv_dialect.py
+++ b/mlir/test/python/dialects/spirv_dialect.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 import mlir.dialects.spirv as spirv
diff --git a/mlir/test/python/dialects/tensor.py b/mlir/test/python/dialects/tensor.py
index ca9066b239111..c09a4e23b8b67 100644
--- a/mlir/test/python/dialects/tensor.py
+++ b/mlir/test/python/dialects/tensor.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 import mlir.dialects.arith as arith
diff --git a/mlir/test/python/dialects/tosa.py b/mlir/test/python/dialects/tosa.py
index 29f63e030ee23..2848c734429c8 100644
--- a/mlir/test/python/dialects/tosa.py
+++ b/mlir/test/python/dialects/tosa.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 import mlir.dialects.tosa as tosa
diff --git a/mlir/test/python/dialects/transform.py b/mlir/test/python/dialects/transform.py
index 6c5e4e5505b1c..8723abe82acdc 100644
--- a/mlir/test/python/dialects/transform.py
+++ b/mlir/test/python/dialects/transform.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import transform
diff --git a/mlir/test/python/dialects/transform_bufferization_ext.py b/mlir/test/python/dialects/transform_bufferization_ext.py
index 03b16c324a407..5cf4f13405fdc 100644
--- a/mlir/test/python/dialects/transform_bufferization_ext.py
+++ b/mlir/test/python/dialects/transform_bufferization_ext.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import transform
diff --git a/mlir/test/python/dialects/transform_debug_ext.py b/mlir/test/python/dialects/transform_debug_ext.py
index 2dfdaed343865..320011f104faf 100644
--- a/mlir/test/python/dialects/transform_debug_ext.py
+++ b/mlir/test/python/dialects/transform_debug_ext.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import transform
diff --git a/mlir/test/python/dialects/transform_extras.py b/mlir/test/python/dialects/transform_extras.py
index ea47f170cb632..1afa36e3a9064 100644
--- a/mlir/test/python/dialects/transform_extras.py
+++ b/mlir/test/python/dialects/transform_extras.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from typing import Callable
 from mlir import ir
diff --git a/mlir/test/python/dialects/transform_gpu_ext.py b/mlir/test/python/dialects/transform_gpu_ext.py
index 17f5a6d38f8c1..fa7cd652adf34 100644
--- a/mlir/test/python/dialects/transform_gpu_ext.py
+++ b/mlir/test/python/dialects/transform_gpu_ext.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import transform
diff --git a/mlir/test/python/dialects/transform_interpreter.py b/mlir/test/python/dialects/transform_interpreter.py
index 819a3be1db9d5..a099ed499b7fa 100644
--- a/mlir/test/python/dialects/transform_interpreter.py
+++ b/mlir/test/python/dialects/transform_interpreter.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir import ir
 from mlir.dialects.transform import interpreter as interp
diff --git a/mlir/test/python/dialects/transform_loop_ext.py b/mlir/test/python/dialects/transform_loop_ext.py
index 430b33fba04c7..adf8939073743 100644
--- a/mlir/test/python/dialects/transform_loop_ext.py
+++ b/mlir/test/python/dialects/transform_loop_ext.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import transform
diff --git a/mlir/test/python/dialects/transform_memref_ext.py b/mlir/test/python/dialects/transform_memref_ext.py
index e7d871c9eac8c..8464598a35f92 100644
--- a/mlir/test/python/dialects/transform_memref_ext.py
+++ b/mlir/test/python/dialects/transform_memref_ext.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 
 from mlir.ir import *
diff --git a/mlir/test/python/dialects/transform_nvgpu_ext.py b/mlir/test/python/dialects/transform_nvgpu_ext.py
index 1de8b25bab7a5..735132d12d964 100644
--- a/mlir/test/python/dialects/transform_nvgpu_ext.py
+++ b/mlir/test/python/dialects/transform_nvgpu_ext.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import transform
diff --git a/mlir/test/python/dialects/transform_sparse_tensor_ext.py b/mlir/test/python/dialects/transform_sparse_tensor_ext.py
index e11cc6bf1e074..ae0fd9758a42d 100644
--- a/mlir/test/python/dialects/transform_sparse_tensor_ext.py
+++ b/mlir/test/python/dialects/transform_sparse_tensor_ext.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import transform
diff --git a/mlir/test/python/dialects/transform_structured_ext.py b/mlir/test/python/dialects/transform_structured_ext.py
index 8785d6d360074..999b18a8f794c 100644
--- a/mlir/test/python/dialects/transform_structured_ext.py
+++ b/mlir/test/python/dialects/transform_structured_ext.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import functools
 from typing import Callable
diff --git a/mlir/test/python/dialects/transform_tensor_ext.py b/mlir/test/python/dialects/transform_tensor_ext.py
index a2e7aa242b9da..0b16c5ab39e9d 100644
--- a/mlir/test/python/dialects/transform_tensor_ext.py
+++ b/mlir/test/python/dialects/transform_tensor_ext.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import transform
diff --git a/mlir/test/python/dialects/transform_tune_ext.py b/mlir/test/python/dialects/transform_tune_ext.py
index dfb93594bca52..cf10fc5f1e042 100644
--- a/mlir/test/python/dialects/transform_tune_ext.py
+++ b/mlir/test/python/dialects/transform_tune_ext.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import transform
diff --git a/mlir/test/python/dialects/transform_vector_ext.py b/mlir/test/python/dialects/transform_vector_ext.py
index 5a648fe073315..5cba5dc67cb41 100644
--- a/mlir/test/python/dialects/transform_vector_ext.py
+++ b/mlir/test/python/dialects/transform_vector_ext.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 from mlir.dialects import transform
diff --git a/mlir/test/python/dialects/ub.py b/mlir/test/python/dialects/ub.py
index 0d88da82c5e7b..80064643b2e0d 100644
--- a/mlir/test/python/dialects/ub.py
+++ b/mlir/test/python/dialects/ub.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 # This is just a smoke test that the dialect is functional.
 from array import array
 
diff --git a/mlir/test/python/dialects/vector.py b/mlir/test/python/dialects/vector.py
index 77eaf94a830d9..0e2d9da1cc506 100644
--- a/mlir/test/python/dialects/vector.py
+++ b/mlir/test/python/dialects/vector.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 import mlir.dialects.builtin as builtin
diff --git a/mlir/test/python/execution_engine.py b/mlir/test/python/execution_engine.py
index d569fcef32bfd..d7b1952270f99 100644
--- a/mlir/test/python/execution_engine.py
+++ b/mlir/test/python/execution_engine.py
@@ -1,4 +1,5 @@
 # RUN: env MLIR_RUNNER_UTILS=%mlir_runner_utils MLIR_C_RUNNER_UTILS=%mlir_c_runner_utils %PYTHON %s 2>&1 | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 # REQUIRES: host-supports-jit
 import gc, sys, os, tempfile
 from mlir.ir import *
diff --git a/mlir/test/python/global_constructors.py b/mlir/test/python/global_constructors.py
index 5020c00344a33..c06155f1cc075 100644
--- a/mlir/test/python/global_constructors.py
+++ b/mlir/test/python/global_constructors.py
@@ -1,5 +1,6 @@
 # UNSUPPORTED: target=aarch64{{.*}}, target=arm64{{.*}}
 # RUN: %PYTHON %s 2>&1 | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 # REQUIRES: host-supports-jit
 import gc, sys, os, tempfile
 from mlir.ir import *
diff --git a/mlir/test/python/integration/dialects/linalg/opsrun.py b/mlir/test/python/integration/dialects/linalg/opsrun.py
index 8f202318146ee..3b2bdb9771eb6 100644
--- a/mlir/test/python/integration/dialects/linalg/opsrun.py
+++ b/mlir/test/python/integration/dialects/linalg/opsrun.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s 2>&1 | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import ctypes
 import sys
diff --git a/mlir/test/python/integration/dialects/pdl.py b/mlir/test/python/integration/dialects/pdl.py
index dd6c74ce622c8..cb8078242d53e 100644
--- a/mlir/test/python/integration/dialects/pdl.py
+++ b/mlir/test/python/integration/dialects/pdl.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s 2>&1 | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.dialects import arith, func, pdl
 from mlir.dialects.builtin import module
diff --git a/mlir/test/python/integration/dialects/transform.py b/mlir/test/python/integration/dialects/transform.py
index 303274a8f8828..4d004e0d64549 100644
--- a/mlir/test/python/integration/dialects/transform.py
+++ b/mlir/test/python/integration/dialects/transform.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s 2>&1 | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.passmanager import PassManager
 from mlir.ir import Context, Location, Module, InsertionPoint, UnitAttr
diff --git a/mlir/test/python/ir/affine_expr.py b/mlir/test/python/ir/affine_expr.py
index c2a2ab3509ca6..f4bbb8a683820 100644
--- a/mlir/test/python/ir/affine_expr.py
+++ b/mlir/test/python/ir/affine_expr.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc
 from mlir.ir import *
diff --git a/mlir/test/python/ir/affine_map.py b/mlir/test/python/ir/affine_map.py
index 672335e9bf8a7..3ec7856df7221 100644
--- a/mlir/test/python/ir/affine_map.py
+++ b/mlir/test/python/ir/affine_map.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc
 from mlir.ir import *
diff --git a/mlir/test/python/ir/array_attributes.py b/mlir/test/python/ir/array_attributes.py
index 66f7ec8e7fff1..317413012b1dc 100644
--- a/mlir/test/python/ir/array_attributes.py
+++ b/mlir/test/python/ir/array_attributes.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 # Note that this is separate from ir_attributes.py since it depends on numpy,
 # and we may want to disable if not available.
 
diff --git a/mlir/test/python/ir/attributes.py b/mlir/test/python/ir/attributes.py
index 2f3c4460d3f59..9fc68b239cf27 100644
--- a/mlir/test/python/ir/attributes.py
+++ b/mlir/test/python/ir/attributes.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc
 
diff --git a/mlir/test/python/ir/auto_location.py b/mlir/test/python/ir/auto_location.py
index 01b5542119b4e..4499524d9e75f 100644
--- a/mlir/test/python/ir/auto_location.py
+++ b/mlir/test/python/ir/auto_location.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 # REQUIRES: python-ge-311
 import gc
 from contextlib import contextmanager
diff --git a/mlir/test/python/ir/blocks.py b/mlir/test/python/ir/blocks.py
index ced5fce434728..49c636c3549ba 100644
--- a/mlir/test/python/ir/blocks.py
+++ b/mlir/test/python/ir/blocks.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc
 
diff --git a/mlir/test/python/ir/builtin_types.py b/mlir/test/python/ir/builtin_types.py
index b42bfd9bc6587..c06747a5188f9 100644
--- a/mlir/test/python/ir/builtin_types.py
+++ b/mlir/test/python/ir/builtin_types.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc
 from mlir.ir import *
diff --git a/mlir/test/python/ir/context_lifecycle.py b/mlir/test/python/ir/context_lifecycle.py
index 230db8277c8e7..17839482a00b0 100644
--- a/mlir/test/python/ir/context_lifecycle.py
+++ b/mlir/test/python/ir/context_lifecycle.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 # Standalone sanity check of context life-cycle.
 import gc
 import mlir.ir
diff --git a/mlir/test/python/ir/context_managers.py b/mlir/test/python/ir/context_managers.py
index 5d9f9ceee97f3..11b4f07d1ef46 100644
--- a/mlir/test/python/ir/context_managers.py
+++ b/mlir/test/python/ir/context_managers.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc
 from mlir.ir import *
diff --git a/mlir/test/python/ir/debug.py b/mlir/test/python/ir/debug.py
index 629a710e68585..cd8d3726a8f36 100644
--- a/mlir/test/python/ir/debug.py
+++ b/mlir/test/python/ir/debug.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 from mlir.ir import *
 
diff --git a/mlir/test/python/ir/diagnostic_handler.py b/mlir/test/python/ir/diagnostic_handler.py
index 6d273e5092e42..d67bcbd4b1449 100644
--- a/mlir/test/python/ir/diagnostic_handler.py
+++ b/mlir/test/python/ir/diagnostic_handler.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc
 from mlir.ir import *
diff --git a/mlir/test/python/ir/dialects.py b/mlir/test/python/ir/dialects.py
index 5a2ed684d298b..3cf2a072d7e33 100644
--- a/mlir/test/python/ir/dialects.py
+++ b/mlir/test/python/ir/dialects.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc
 import sys
diff --git a/mlir/test/python/ir/exception.py b/mlir/test/python/ir/exception.py
index 74085cd349643..a876f52f37d34 100644
--- a/mlir/test/python/ir/exception.py
+++ b/mlir/test/python/ir/exception.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc
 from mlir.ir import *
diff --git a/mlir/test/python/ir/insertion_point.py b/mlir/test/python/ir/insertion_point.py
index f48beb25f04b2..9d99ec1e2e144 100644
--- a/mlir/test/python/ir/insertion_point.py
+++ b/mlir/test/python/ir/insertion_point.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc
 from mlir.ir import *
diff --git a/mlir/test/python/ir/integer_set.py b/mlir/test/python/ir/integer_set.py
index 9fe0480c33a2a..0f17c9c872b8d 100644
--- a/mlir/test/python/ir/integer_set.py
+++ b/mlir/test/python/ir/integer_set.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc
 from mlir.ir import *
diff --git a/mlir/test/python/ir/location.py b/mlir/test/python/ir/location.py
index 3e54dc922cd67..408d3ac3221d9 100644
--- a/mlir/test/python/ir/location.py
+++ b/mlir/test/python/ir/location.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc
 from mlir.ir import *
diff --git a/mlir/test/python/ir/module.py b/mlir/test/python/ir/module.py
index ad4c9340a6c82..028786f5bf6a6 100644
--- a/mlir/test/python/ir/module.py
+++ b/mlir/test/python/ir/module.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc
 from tempfile import NamedTemporaryFile
diff --git a/mlir/test/python/ir/operation.py b/mlir/test/python/ir/operation.py
index 4a3625c953d52..60223c9443298 100644
--- a/mlir/test/python/ir/operation.py
+++ b/mlir/test/python/ir/operation.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc
 import io
diff --git a/mlir/test/python/ir/symbol_table.py b/mlir/test/python/ir/symbol_table.py
index 99d5fadfea10a..6abb88e48228a 100644
--- a/mlir/test/python/ir/symbol_table.py
+++ b/mlir/test/python/ir/symbol_table.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc
 import io
diff --git a/mlir/test/python/ir/value.py b/mlir/test/python/ir/value.py
index 4a241afb8e89d..ff4142b6d6be7 100644
--- a/mlir/test/python/ir/value.py
+++ b/mlir/test/python/ir/value.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s | FileCheck %s --enable-var-scope=false
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc
 from mlir.ir import *
diff --git a/mlir/test/python/live_operations.py b/mlir/test/python/live_operations.py
index 892ed1715f6c7..bda727e25e796 100644
--- a/mlir/test/python/live_operations.py
+++ b/mlir/test/python/live_operations.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 # It is sufficient that this doesn't assert.
 
 from mlir.ir import *
diff --git a/mlir/test/python/multithreaded_tests.py b/mlir/test/python/multithreaded_tests.py
index 6e1a668346872..420d32aa58c29 100644
--- a/mlir/test/python/multithreaded_tests.py
+++ b/mlir/test/python/multithreaded_tests.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 """
 This script generates multi-threaded tests to check free-threading mode using CPython compiled with TSAN.
 Tests can be run using pytest:
diff --git a/mlir/test/python/mypy.ini b/mlir/test/python/mypy.ini
new file mode 100644
index 0000000000000..0cc32c4d33492
--- /dev/null
+++ b/mlir/test/python/mypy.ini
@@ -0,0 +1,3 @@
+[mypy]
+strict = True
+pretty = True
\ No newline at end of file
diff --git a/mlir/test/python/pass_manager.py b/mlir/test/python/pass_manager.py
index 5f92f5b52a09a..3526cec7fb6e0 100644
--- a/mlir/test/python/pass_manager.py
+++ b/mlir/test/python/pass_manager.py
@@ -1,4 +1,5 @@
 # RUN: %PYTHON %s 2>&1 | FileCheck %s
+# RUN: %PYTHON -m mypy %s --config-file %mlir_src_root/test/python/mypy.ini
 
 import gc, os, sys, tempfile
 from mlir.ir import *



More information about the llvm-commits mailing list