diff --git a/src/EditorFeatures/CSharpTest/RemoveUnusedParametersAndValues/RemoveUnusedValueAssignmentTests.cs b/src/EditorFeatures/CSharpTest/RemoveUnusedParametersAndValues/RemoveUnusedValueAssignmentTests.cs index 4f67d337b30d2e99bce12ce6fe5823a92e67a147..5d551dbf24e3e31ad1d477ba81998c2d671bfe30 100644 --- a/src/EditorFeatures/CSharpTest/RemoveUnusedParametersAndValues/RemoveUnusedValueAssignmentTests.cs +++ b/src/EditorFeatures/CSharpTest/RemoveUnusedParametersAndValues/RemoveUnusedValueAssignmentTests.cs @@ -268,6 +268,31 @@ int M() }", optionName); } + [Theory, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnusedValues)] + [InlineData(nameof(PreferDiscard))] + [InlineData(nameof(PreferUnusedLocal))] + public async Task Initialization_NonConstantValue_DefaultExpression(string optionName) + { + await TestInRegularAndScriptAsync( +@"struct C +{ + C M() + { + C [|c|] = default(C); + c = new C(); + return c; + } +}", +@"struct C +{ + C M() + { + C c = new C(); + return c; + } +}", optionName); + } + [Theory, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnusedValues)] [InlineData(nameof(PreferDiscard))] [InlineData(nameof(PreferUnusedLocal))] diff --git a/src/Features/Core/Portable/RemoveUnusedParametersAndValues/AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.BlockAnalyzer.cs b/src/Features/Core/Portable/RemoveUnusedParametersAndValues/AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.BlockAnalyzer.cs index 5eb0885e7373531192f3bf67e1ce2923adebe21f..246cff2fe47fdbe68217db5b5c9ddc08915682bc 100644 --- a/src/Features/Core/Portable/RemoveUnusedParametersAndValues/AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.BlockAnalyzer.cs +++ b/src/Features/Core/Portable/RemoveUnusedParametersAndValues/AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.BlockAnalyzer.cs @@ -405,16 +405,20 @@ bool IsRemovableAssignmentWithoutSideEffects(IOperation unusedSymbolWriteOperati switch (assignment.Value.Kind) { - // Parameter/local references have no side effects and can be removed. case OperationKind.ParameterReference: case OperationKind.LocalReference: + // Parameter/local references have no side effects and can be removed. return true; - // Field references with null instance (static fields) or 'this' or 'Me' instance can - // have no side effects and can be removed. case OperationKind.FieldReference: + // Field references with null instance (static fields) or 'this' or 'Me' instance can + // have no side effects and can be removed. var fieldReference = (IFieldReferenceOperation)assignment.Value; return fieldReference.Instance == null || fieldReference.Instance.Kind == OperationKind.InstanceReference; + + case OperationKind.DefaultValue: + // default value expressions have no side-effects. + return true; } } else if (unusedSymbolWriteOperation.Parent is IIncrementOrDecrementOperation)