diff --git a/src/MSBuild.UnitTests/XMake_Tests.cs b/src/MSBuild.UnitTests/XMake_Tests.cs index d0e8ea678ec..1fafe1f5bef 100644 --- a/src/MSBuild.UnitTests/XMake_Tests.cs +++ b/src/MSBuild.UnitTests/XMake_Tests.cs @@ -697,6 +697,36 @@ public void ExecuteAppWithGetPropertyItemAndTargetResult( results.ShouldNotContain(ResourceUtilities.GetResourceString("BuildFailedWithPropertiesItemsOrTargetResultsRequested")); } + [Theory] + [InlineData(true)] + [InlineData(false)] + public void BuildFailsWithCompileErrorAndRestore(bool isGraphBuild) + { + using TestEnvironment env = TestEnvironment.Create(); + TransientTestFile project = env.CreateFile("testProject.csproj", @" + + + + + + + + + + "); + TransientTestFile wrongSyntaxFile = env.CreateFile("Program.cs", @" + Console.WriteLine(""Hello, World!"") + A Line here for this to not compile right"); + + string graph = isGraphBuild ? "--graph" : ""; + string result = RunnerUtilities.ExecMSBuild($" {project.Path} /restore {graph}", out bool success); + + success.ShouldBeFalse(); + result.ShouldContain("Program.cs(2,47): error CS1002: ; expected"); + result.ShouldContain("Program.cs(3,20): error CS1003: Syntax error, ','"); + result.ShouldContain("Program.cs(3,54): error CS1002: ; expected"); + } + /// /// Regression test for bug where the MSBuild.exe command-line app /// would sometimes set the UI culture to just "en" which is considered a "neutral" UI diff --git a/src/MSBuild/XMake.cs b/src/MSBuild/XMake.cs index 4bd327aa7de..d5b98d4906b 100644 --- a/src/MSBuild/XMake.cs +++ b/src/MSBuild/XMake.cs @@ -1544,6 +1544,10 @@ internal static bool BuildProject( { return false; } + else + { + success = result.OverallResult == BuildResultCode.Success; + } } if (!restoreOnly) @@ -1568,21 +1572,14 @@ internal static bool BuildProject( entryValue.Equals(propertyKvp.Value))) .Value; } - else - { - success = graphResult.OverallResult == BuildResultCode.Success; - } + success = graphResult.OverallResult == BuildResultCode.Success; } else { result = ExecuteBuild(buildManager, buildRequest); + success = result.OverallResult == BuildResultCode.Success; } } - - if (result != null && result.Exception == null) - { - success = result.OverallResult == BuildResultCode.Success; - } } finally {