From 3588e1453240ca59ead8b5f8e63cdb8989bf8f84 Mon Sep 17 00:00:00 2001
From: Bob Arnson <bob@firegiant.com>
Date: Sun, 7 Feb 2021 19:06:11 -0500
Subject: Improve duplicate-id reporting.

---
 .../Link/FindEntrySectionAndLoadSymbolsCommand.cs  |  1 +
 .../RegistryFixture.cs                             | 26 ++++++++++++++++++++++
 .../Registry/DuplicateRegistryValueIds.wxs         | 14 ++++++++++++
 3 files changed, 41 insertions(+)
 create mode 100644 src/test/WixToolsetTest.CoreIntegration/TestData/Registry/DuplicateRegistryValueIds.wxs

diff --git a/src/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs b/src/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs
index a4b2bee3..a52d0d63 100644
--- a/src/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs
+++ b/src/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs
@@ -103,6 +103,7 @@ namespace WixToolset.Core.Link
                         }
                         else
                         {
+                            symbolWithSection.AddPossibleConflict(existingSymbol);
                             existingSymbol.AddPossibleConflict(symbolWithSection);
                             possibleConflicts.Add(symbolWithSection);
                         }
diff --git a/src/test/WixToolsetTest.CoreIntegration/RegistryFixture.cs b/src/test/WixToolsetTest.CoreIntegration/RegistryFixture.cs
index 654b8740..e4d95b5d 100644
--- a/src/test/WixToolsetTest.CoreIntegration/RegistryFixture.cs
+++ b/src/test/WixToolsetTest.CoreIntegration/RegistryFixture.cs
@@ -79,6 +79,32 @@ namespace WixToolsetTest.CoreIntegration
             }
         }
 
+        [Fact]
+        public void DuplicateRegistryValueIdsAreDetectedSmoothly()
+        {
+            var folder = TestData.Get(@"TestData");
+
+            using (var fs = new DisposableFileSystem())
+            {
+                var baseFolder = fs.GetFolder();
+                var intermediateFolder = Path.Combine(baseFolder, "obj");
+                var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
+
+                var result = WixRunner.Execute(new[]
+                {
+                    "build",
+                    Path.Combine(folder, "Registry", "DuplicateRegistryValueIds.wxs"),
+                    Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
+                    "-bindpath", Path.Combine(folder, "SingleFile", "data"),
+                    "-intermediateFolder", intermediateFolder,
+                    "-o", msiPath
+                }, out var messages);
+
+                Assert.Equal(2, messages.Where(m => m.Id == (int)ErrorMessages.Ids.DuplicateSymbol).Count());
+                Assert.Equal(2, messages.Where(m => m.Id == (int)ErrorMessages.Ids.DuplicateSymbol2).Count());
+            }
+        }
+
         [Fact]
         public void PopulatesRegistryTableFromRemoveRegistryKey()
         {
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/Registry/DuplicateRegistryValueIds.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/Registry/DuplicateRegistryValueIds.wxs
new file mode 100644
index 00000000..452aea69
--- /dev/null
+++ b/src/test/WixToolsetTest.CoreIntegration/TestData/Registry/DuplicateRegistryValueIds.wxs
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
+    <Fragment>
+        <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
+            <Component>
+                <RegistryKey Root="HKLM" Key="Software\Acme\Foobar 1.0">
+                    <RegistryValue Type="string" Name="InstallDir" Value="[TARGETDIR]" />
+                    <RegistryValue Type="string" Name="InstallDir" Value="[INSTALLDIR]" />
+                    <RegistryValue Type="string" Name="InstallDir" Value="[ProgramFilesFolder]" />
+                </RegistryKey>
+            </Component>
+        </ComponentGroup>
+    </Fragment>
+</Wix>
-- 
cgit v1.2.3-55-g6feb