diff --git a/src/Build.OM.UnitTests/Definition/ProjectItem_Tests.cs b/src/Build.OM.UnitTests/Definition/ProjectItem_Tests.cs
index 9299381c7ca..d94e4ab56e0 100644
--- a/src/Build.OM.UnitTests/Definition/ProjectItem_Tests.cs
+++ b/src/Build.OM.UnitTests/Definition/ProjectItem_Tests.cs
@@ -2774,6 +2774,17 @@ public void UpdateShouldImportMetadataFromReferencedItem()
ObjectModelHelpers.AssertItemHasMetadata(expectedMetadataC, items[4]);
}
+ [Fact]
+ public void OptimizedRemoveOperationRespectsCondition()
+ {
+ string content = @"
+
+ ";
+ IList items = ObjectModelHelpers.GetItemsFromFragment(content, true);
+
+ items[0].EvaluatedInclude.ShouldBe("InitialValue");
+ }
+
[Theory]
[InlineData(true)]
[InlineData(false)]
diff --git a/src/Build/Evaluation/LazyItemEvaluator.RemoveOperation.cs b/src/Build/Evaluation/LazyItemEvaluator.RemoveOperation.cs
index 546ef225a4e..bcfe47d6c84 100644
--- a/src/Build/Evaluation/LazyItemEvaluator.RemoveOperation.cs
+++ b/src/Build/Evaluation/LazyItemEvaluator.RemoveOperation.cs
@@ -38,7 +38,7 @@ protected override void ApplyImpl(ImmutableList.Builder listBuilder, I
new BuildEventFileInfo(string.Empty),
"OM_MatchOnMetadataIsRestrictedToOnlyOneReferencedItem");
- if (_matchOnMetadata.IsEmpty && ItemspecContainsASingleBareItemReference(_itemSpec, _itemElement.ItemType))
+ if (_matchOnMetadata.IsEmpty && ItemspecContainsASingleBareItemReference(_itemSpec, _itemElement.ItemType) && _conditionResult)
{
// Perf optimization: If the Remove operation references itself (e.g. )
// then all items are removed and matching is not necessary