From 81cee5822feceefe13982a87ed48c8ff5165d332 Mon Sep 17 00:00:00 2001
From: Matthew Pickering <matthewtpickering@gmail.com>
Date: Tue, 30 Jul 2024 12:50:36 +0100
Subject: [PATCH] driver: Fix -Wmissing-home-modules when multiple units have
 the same module name

It was assumed that module names were unique but that isn't true with
multiple units.

The fix is quite simple, maintain a set of `(ModuleName, UnitId)` and
query that to see whether the module has been specified.

Fixes #25122

(cherry picked from commit 951ce3d5904a1d34d49787d444f99e251e24d4e7)
---
 compiler/GHC/Driver/Make.hs                               | 6 ++++--
 testsuite/tests/driver/multipleHomeUnits/T25122/T25122.hs | 1 +
 testsuite/tests/driver/multipleHomeUnits/all.T            | 5 +++++
 testsuite/tests/driver/multipleHomeUnits/unitSame1        | 3 +++
 testsuite/tests/driver/multipleHomeUnits/unitSame2        | 3 +++
 5 files changed, 16 insertions(+), 2 deletions(-)
 create mode 100644 testsuite/tests/driver/multipleHomeUnits/T25122/T25122.hs
 create mode 100644 testsuite/tests/driver/multipleHomeUnits/unitSame1
 create mode 100644 testsuite/tests/driver/multipleHomeUnits/unitSame2

diff --git a/compiler/GHC/Driver/Make.hs b/compiler/GHC/Driver/Make.hs
index 7c0c1216878..067b0609faa 100644
--- a/compiler/GHC/Driver/Make.hs
+++ b/compiler/GHC/Driver/Make.hs
@@ -340,10 +340,12 @@ warnMissingHomeModules dflags targets mod_graph =
     -- Note also that we can't always infer the associated module name
     -- directly from the filename argument.  See #13727.
     is_known_module mod =
-      (Map.lookup (moduleName (ms_mod mod)) mod_targets == Just (ms_unitid mod))
+      is_module_target mod
       ||
       maybe False is_file_target (ml_hs_file (ms_location mod))
 
+    is_module_target mod = (moduleName (ms_mod mod), ms_unitid mod) `Set.member` mod_targets
+
     is_file_target file = Set.member (withoutExt file) file_targets
 
     file_targets = Set.fromList (mapMaybe file_target targets)
@@ -354,7 +356,7 @@ warnMissingHomeModules dflags targets mod_graph =
         TargetFile file _ ->
           Just (withoutExt (augmentByWorkingDirectory dflags file))
 
-    mod_targets = Map.fromList (mod_target <$> targets)
+    mod_targets = Set.fromList (mod_target <$> targets)
 
     mod_target Target {targetUnitId, targetId} =
       case targetId of
diff --git a/testsuite/tests/driver/multipleHomeUnits/T25122/T25122.hs b/testsuite/tests/driver/multipleHomeUnits/T25122/T25122.hs
new file mode 100644
index 00000000000..62145c3eee0
--- /dev/null
+++ b/testsuite/tests/driver/multipleHomeUnits/T25122/T25122.hs
@@ -0,0 +1 @@
+module T25122 where
diff --git a/testsuite/tests/driver/multipleHomeUnits/all.T b/testsuite/tests/driver/multipleHomeUnits/all.T
index f748b6013df..6bfd151a1af 100644
--- a/testsuite/tests/driver/multipleHomeUnits/all.T
+++ b/testsuite/tests/driver/multipleHomeUnits/all.T
@@ -71,6 +71,11 @@ test('multipleHomeUnits_shared', [extra_files([ 'A.hs', 'unitShared1', 'unitShar
 
 test('multipleHomeUnits_shared_ghci', [extra_files([ 'shared.script', 'A.hs', 'unitShared1', 'unitShared2']), extra_run_opts('-unit @unitShared1 -unit @unitShared2')], ghci_script, ['shared.script'])
 
+test('T25122',
+    [ extra_files(
+        [ 'T25122', 'unitSame1', 'unitSame2'])
+    ], multiunit_compile, [['unitSame1', 'unitSame2'], '-v0 -fhide-source-paths -Werror -Wmissing-home-modules'])
+
 
 
 
diff --git a/testsuite/tests/driver/multipleHomeUnits/unitSame1 b/testsuite/tests/driver/multipleHomeUnits/unitSame1
new file mode 100644
index 00000000000..96d32a2efab
--- /dev/null
+++ b/testsuite/tests/driver/multipleHomeUnits/unitSame1
@@ -0,0 +1,3 @@
+T25122
+-iT25122
+-this-unit-id=s1
diff --git a/testsuite/tests/driver/multipleHomeUnits/unitSame2 b/testsuite/tests/driver/multipleHomeUnits/unitSame2
new file mode 100644
index 00000000000..e951afe5755
--- /dev/null
+++ b/testsuite/tests/driver/multipleHomeUnits/unitSame2
@@ -0,0 +1,3 @@
+T25122
+-iT25122
+-this-unit-id=u2
-- 
GitLab