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