@@ -4357,19 +4357,20 @@ private static bool TryEmitSwitch(SwitchExpression expr, IReadOnlyList<PE> param
43574357 //- if switch SwitchValue is a nullable parameter, we should call getValue only once and store the result.
43584358 //- use comparison methods (when defined)
43594359
4360- var cases = expr . Cases ;
43614360 var endLabel = il . DefineLabel ( ) ;
4361+ var cases = expr . Cases ;
43624362 var labels = new Label [ cases . Count ] ;
4363- for ( var index = 0 ; index < cases . Count ; index ++ )
4363+ var dontIgnoreTestResult = parent & ~ ParentFlags . IgnoreResult ;
4364+ for ( var caseIndex = 0 ; caseIndex < cases . Count ; ++ caseIndex )
43644365 {
4365- var switchCase = cases [ index ] ;
4366- labels [ index ] = il . DefineLabel ( ) ;
4366+ var cs = cases [ caseIndex ] ;
4367+ labels [ caseIndex ] = il . DefineLabel ( ) ;
43674368
4368- foreach ( var switchCaseTestValue in switchCase . TestValues )
4369+ foreach ( var caseTestValue in cs . TestValues )
43694370 {
4370- if ( ! TryEmitComparison ( expr . SwitchValue , switchCaseTestValue , ExpressionType . Equal , paramExprs , il , ref closure , setup , parent ) )
4371+ if ( ! TryEmitComparison ( expr . SwitchValue , caseTestValue , ExpressionType . Equal , paramExprs , il , ref closure , setup , dontIgnoreTestResult ) )
43714372 return false ;
4372- il . Emit ( OpCodes . Brtrue , labels [ index ] ) ;
4373+ il . Emit ( OpCodes . Brtrue , labels [ caseIndex ] ) ;
43734374 }
43744375 }
43754376
@@ -4380,19 +4381,18 @@ private static bool TryEmitSwitch(SwitchExpression expr, IReadOnlyList<PE> param
43804381 il . Emit ( OpCodes . Br , endLabel ) ;
43814382 }
43824383
4383- for ( var index = 0 ; index < cases . Count ; ++ index )
4384+ for ( var caseIndex = 0 ; caseIndex < cases . Count ; ++ caseIndex )
43844385 {
4385- var switchCase = cases [ index ] ;
4386- il . MarkLabel ( labels [ index ] ) ;
4387- if ( ! TryEmit ( switchCase . Body , paramExprs , il , ref closure , setup , parent ) )
4386+ il . MarkLabel ( labels [ caseIndex ] ) ;
4387+ var cs = cases [ caseIndex ] ;
4388+ if ( ! TryEmit ( cs . Body , paramExprs , il , ref closure , setup , parent ) )
43884389 return false ;
43894390
4390- if ( index != cases . Count - 1 )
4391+ if ( caseIndex != cases . Count - 1 )
43914392 il . Emit ( OpCodes . Br , endLabel ) ;
43924393 }
43934394
43944395 il . MarkLabel ( endLabel ) ;
4395-
43964396 return true ;
43974397 }
43984398
@@ -4414,8 +4414,8 @@ private static bool TryEmitComparison(Expression exprLeft, Expression exprRight,
44144414 }
44154415
44164416 int lVarIndex = - 1 , rVarIndex = - 1 ;
4417- if ( ! TryEmit ( exprLeft , paramExprs , il , ref closure , setup ,
4418- parent & ~ ParentFlags . IgnoreResult & ~ ParentFlags . InstanceAccess ) )
4417+ var operandParent = parent & ~ ParentFlags . IgnoreResult & ~ ParentFlags . InstanceAccess ;
4418+ if ( ! TryEmit ( exprLeft , paramExprs , il , ref closure , setup , operandParent ) )
44194419 return false ;
44204420
44214421 if ( leftIsNullable )
@@ -4425,8 +4425,7 @@ private static bool TryEmitComparison(Expression exprLeft, Expression exprRight,
44254425 leftOpType = Nullable . GetUnderlyingType ( leftOpType ) ;
44264426 }
44274427
4428- if ( ! TryEmit ( exprRight , paramExprs , il , ref closure , setup ,
4429- parent & ~ ParentFlags . IgnoreResult & ~ ParentFlags . InstanceAccess ) )
4428+ if ( ! TryEmit ( exprRight , paramExprs , il , ref closure , setup , operandParent ) )
44304429 return false ;
44314430
44324431 if ( leftOpType != rightOpType )
0 commit comments