diff --git a/src/Build.UnitTests/WarningsAsMessagesAndErrors_Tests.cs b/src/Build.UnitTests/WarningsAsMessagesAndErrors_Tests.cs index 5f05b945e94..b6752b6b87f 100644 --- a/src/Build.UnitTests/WarningsAsMessagesAndErrors_Tests.cs +++ b/src/Build.UnitTests/WarningsAsMessagesAndErrors_Tests.cs @@ -555,5 +555,123 @@ public void MSBuildWarningsAsMessagesWithCommaSeparation() logger.ErrorCount.ShouldBe(0); } } + + /// + /// NoWarn should be honored in addition to MSBuildWarningsAsMessages when both are set. + /// This tests the fix in Microsoft.Common.CurrentVersion.targets where NoWarn was ignored + /// if MSBuildWarningsAsMessages was already set. + /// See: https://github.com/dotnet/msbuild/issues/12808 + /// + [Fact] + public void NoWarnHonoredWhenMSBuildWarningsAsMessagesIsSetViaTargets() + { + using (TestEnvironment env = TestEnvironment.Create(_output)) + { + // NoWarn sets NAT013, MSBuildWarningsAsMessages sets NAT011 and NAT012 + // Both should be treated as messages (not warnings) when Common targets are imported + var content = """ + + + + + AnyCPU + Debug + bin\Debug + NAT013 + NAT011;NAT012 + + + + + + + + + + + """; + TransientTestProjectWithFiles proj = env.CreateTestProjectWithFiles(content); + + MockLogger logger = proj.BuildProjectExpectSuccess(); + logger.WarningCount.ShouldBe(0); + logger.ErrorCount.ShouldBe(0); + } + } + + /// + /// NoWarn should work when MSBuildWarningsAsMessages is NOT set via targets (original behavior). + /// + [Fact] + public void NoWarnWorksWhenMSBuildWarningsAsMessagesIsNotSetViaTargets() + { + using (TestEnvironment env = TestEnvironment.Create(_output)) + { + // NoWarn sets NAT013, MSBuildWarningsAsMessages is not set + // NAT013 should be treated as a message (not a warning) when Common targets are imported + var content = """ + + + + + AnyCPU + Debug + bin\Debug + NAT013 + + + + + + + + + """; + TransientTestProjectWithFiles proj = env.CreateTestProjectWithFiles(content); + + MockLogger logger = proj.BuildProjectExpectSuccess(); + logger.WarningCount.ShouldBe(0); + logger.ErrorCount.ShouldBe(0); + } + } + + /// + /// Duplicate diagnostic codes in both NoWarn and MSBuildWarningsAsMessages should be handled correctly. + /// When the same code appears in both properties, the warning should still be treated as a message. + /// + [Fact] + public void DuplicateDiagnosticCodesInNoWarnAndMSBuildWarningsAsMessagesAreHandled() + { + using (TestEnvironment env = TestEnvironment.Create(_output)) + { + // NAT012 is in both NoWarn and MSBuildWarningsAsMessages + // This tests that duplicate codes are handled correctly + var content = """ + + + + + AnyCPU + Debug + bin\Debug + NAT012;NAT013 + NAT011;NAT012 + + + + + + + + + + + """; + TransientTestProjectWithFiles proj = env.CreateTestProjectWithFiles(content); + + MockLogger logger = proj.BuildProjectExpectSuccess(); + logger.WarningCount.ShouldBe(0); + logger.ErrorCount.ShouldBe(0); + } + } } } diff --git a/src/Tasks/Microsoft.Common.CurrentVersion.targets b/src/Tasks/Microsoft.Common.CurrentVersion.targets index 5ee5e3bc6fd..3a79ff08b6a 100644 --- a/src/Tasks/Microsoft.Common.CurrentVersion.targets +++ b/src/Tasks/Microsoft.Common.CurrentVersion.targets @@ -666,7 +666,7 @@ Copyright (C) Microsoft Corporation. All rights reserved. - $(NoWarn) + $(MSBuildWarningsAsMessages);$(NoWarn) $(WarningsAsErrors) $(WarningsNotAsErrors)