private ConstantValue FoldUnaryOperator( CSharpSyntaxNode syntax, UnaryOperatorKind kind, BoundExpression operand, SpecialType resultType, DiagnosticBag diagnostics) { Debug.Assert(operand != null); // UNDONE: report errors when in a checked context. if (operand.HasAnyErrors) { return null; } var value = operand.ConstantValue; if (value == null || value.IsBad) { return value; } if (kind.IsEnum() && !kind.IsLifted()) { return FoldEnumUnaryOperator(syntax, kind, operand, diagnostics); } var newValue = FoldNeverOverflowUnaryOperator(kind, value); if (newValue != null) { return ConstantValue.Create(newValue, resultType); } if (CheckOverflowAtCompileTime) { try { newValue = FoldCheckedIntegralUnaryOperator(kind, value); } catch (OverflowException) { Error(diagnostics, ErrorCode.ERR_CheckedOverflow, syntax); return ConstantValue.Bad; } } else { newValue = FoldUncheckedIntegralUnaryOperator(kind, value); } if (newValue != null) { return ConstantValue.Create(newValue, resultType); } return null; }