From 6c67bd4c1442e1db7e2f74e9a92e71b173fe8a3e Mon Sep 17 00:00:00 2001 From: Christopher Milan Date: Wed, 1 Apr 2026 14:12:55 -0700 Subject: [PATCH] better error message when invalid renderer is specified (#15573) --- test/null/test_device.py | 5 +++++ tinygrad/device.py | 1 + 2 files changed, 6 insertions(+) diff --git a/test/null/test_device.py b/test/null/test_device.py index 7dc3aaf3c4..6c1ab4f12f 100644 --- a/test/null/test_device.py +++ b/test/null/test_device.py @@ -24,6 +24,11 @@ class TestDevice(unittest.TestCase): with self.assertRaises(ModuleNotFoundError): Device["TYPO"] + @unittest.skipIf(Device.DEFAULT != "CPU", "only run on CPU") + def test_nonexistent_renderer(self): + with self.assertRaisesRegex(AssertionError, "No renderer"): + with Context(DEV="CPU:TYPO"): Device[Device.DEFAULT].renderer + def test_lowercase_canonicalizes(self): device = Device.DEFAULT with Context(DEV=device.lower()): diff --git a/tinygrad/device.py b/tinygrad/device.py index 8437ccc0af..7e72f63f20 100644 --- a/tinygrad/device.py +++ b/tinygrad/device.py @@ -287,6 +287,7 @@ class Compiled: assert (rn:=next((self._renderer_name(r) for r in self.renderers if getenv(f"{self.device}_{self._renderer_name(r)}")), None)) is None, \ f"{self.device}_{rn}=1 is deprecated, use DEV={self.device}:{rn} or {self.device}_CC={rn} instead" renderers = [r for r in self.renderers if self._renderer_name(r) == rn] if (rn:=DEV.target(self.device).renderer) else self.renderers + assert renderers, f"No renderer for {self.device} " + (f"matches request {rn!r}" if rn else "is available") return select_first_inited(renderers, f"No renderer for {self.device} is available", self.cached_renderer) def synchronize(self):