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)