diff --git a/dead.py b/dead.py
index a8254d5..7879cc5 100644
--- a/dead.py
+++ b/dead.py
@@ -87,6 +87,17 @@ class Visitor(ast.NodeVisitor):
             for target in node.targets:
                 if isinstance(target, ast.Name):
                     self.defines[target.id].add(self.definition_str(node))
+
+        if (
+                len(node.targets) == 1 and
+                isinstance(node.targets[0], ast.Name) and
+                node.targets[0].id == '__all__' and
+                isinstance(node.value, (ast.Tuple, ast.List))
+        ):
+            for elt in node.value.elts:
+                if isinstance(elt, ast.Str):
+                    self.reads_target[elt.s].add(self.definition_str(elt))
+
         self.generic_visit(node)
 
     # TODO: AnnAssign

treat names in `__all__` as un-dead
diff --git a/tests/dead_test.py b/tests/dead_test.py
index 875efb2..9ee3a09 100644
--- a/tests/dead_test.py
+++ b/tests/dead_test.py
@@ -28,7 +28,7 @@ def git_dir(tmpdir):
 @pytest.mark.parametrize(
     's',
     (
-        # asign
+        # assign
         'x = 1\nprint(x)\n',
         # function
         'def f(): ...\n'
@@ -61,9 +61,15 @@ def git_dir(tmpdir):
         'print(C())\n',
         # disabled by comment
         'def unused(): ... # dead: disable\n',
+        # exported in __all__
+        'def f(): ...\n'
+        '__all__ = ("f",)',
+        'def g(): ...\n'
+        'def f(): ...\n'
+        '__all__ = ["f", g.__name__]',
     ),
 )
-def test_is_mark_as_used(git_dir, capsys, s):
+def test_is_marked_as_used(git_dir, capsys, s):
     git_dir.join('f.py').write(s)
     subprocess.check_call(('git', 'add', '.'))
     assert not dead.main(())

pip install -e .[dev]
parse_log_pytest
pytest
pytest
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/asottile/dead.git@85f5edbb84b5e118beab4be3346a630e41418a02#egg=dead
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
identify==2.6.9
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
packaging @ file:///croot/packaging_1734472117206/work
pluggy @ file:///croot/pluggy_1733169602837/work
pytest @ file:///croot/pytest_1738938843180/work
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work

name: dead
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - identify==2.6.9
prefix: /opt/conda/envs/dead

tests/dead_test.py::test_is_marked_as_used[def
tests/dead_test.py::test_dead_disable_regex_matching[# tests/dead_test.py::test_dead_disable_regex_matching[#dead:disable] tests/dead_test.py::test_dead_disable_regex_not_matching[# tests/dead_test.py::test_is_marked_as_used[x tests/dead_test.py::test_is_marked_as_used[async tests/dead_test.py::test_is_marked_as_used[class tests/dead_test.py::test_is_marked_as_used[from tests/dead_test.py::test_is_marked_as_used[import tests/dead_test.py::test_is_marked_as_used[MyStr tests/dead_test.py::test_setup_py_entrypoints_mark_as_used tests/dead_test.py::test_never_referenced tests/dead_test.py::test_assignment_not_counted_as_reference tests/dead_test.py::test_only_referenced_in_tests tests/dead_test.py::test_unused_dead_disable_comment tests/dead_test.py::test_partially_disabled
dead.py
dead.py