X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fcfold.cs;h=a23a20a122cf186f500363663fb6e52710d62706;hb=f5a54864670ea45323abdcf2577bd752eeded8fc;hp=2fd83abe03f9b2e26c2c1ad0a5d76b429967833e;hpb=83f13fcc8a608d2f2a87201ce4ae184ef01d1f8b;p=mono.git diff --git a/mcs/mcs/cfold.cs b/mcs/mcs/cfold.cs index 2fd83abe03f..a23a20a122c 100644 --- a/mcs/mcs/cfold.cs +++ b/mcs/mcs/cfold.cs @@ -20,7 +20,7 @@ namespace Mono.CSharp { // // Performs the numeric promotions on the left and right expresions - // and desposits the results on `lc' and `rc'. + // and deposits the results on `lc' and `rc'. // // On success, the types of `lc' and `rc' on output will always match, // and the pair will be one of: @@ -101,8 +101,8 @@ namespace Mono.CSharp { bool bool_res; if (lt == TypeManager.bool_type && lt == rt) { - bool lv = ((BoolConstant) left ).Value; - bool rv = ((BoolConstant) right).Value; + bool lv = (bool) left.GetValue (); + bool rv = (bool) right.GetValue (); switch (oper) { case Binary.Operator.BitwiseAnd: case Binary.Operator.LogicalAnd: @@ -254,23 +254,25 @@ namespace Mono.CSharp { break; case Binary.Operator.Addition: + if (lt == TypeManager.null_type) + return right; + + if (rt == TypeManager.null_type) + return left; + // // If both sides are strings, then concatenate, if // one is a string, and the other is not, then defer // to runtime concatenation // if (lt == TypeManager.string_type || rt == TypeManager.string_type){ - if (lt == TypeManager.string_type && rt == TypeManager.string_type) - return new StringConstant ( - ((StringConstant) left).Value + - ((StringConstant) right).Value, left.Location); + if (lt == rt) + return new StringConstant ((string)left.GetValue () + (string)right.GetValue (), + left.Location); return null; } - if (lt == TypeManager.null_type && lt == rt) - return left; - // // handle "E operator + (E x, U y)" // handle "E operator + (Y y, E x)" @@ -382,8 +384,6 @@ namespace Mono.CSharp { ((DecimalConstant) right).Value); result = new DecimalConstant (res, left.Location); - } else { - throw new Exception ( "Unexepected addition input: " + left); } } catch (OverflowException){ Error_CompileTimeOverflow (loc); @@ -782,7 +782,7 @@ namespace Mono.CSharp { case Binary.Operator.LeftShift: IntConstant ic = right.ConvertImplicitly (TypeManager.int32_type) as IntConstant; if (ic == null){ - Binary.Error_OperatorCannotBeApplied (loc, "<<", lt, rt); + Binary.Error_OperatorCannotBeApplied (left, right, oper, loc); return null; } @@ -798,7 +798,7 @@ namespace Mono.CSharp { if (left.Type == TypeManager.int32_type) return new IntConstant (((IntConstant)left).Value << lshift_val, left.Location); - Binary.Error_OperatorCannotBeApplied (loc, "<<", lt, rt); + Binary.Error_OperatorCannotBeApplied (left, right, oper, loc); break; // @@ -807,7 +807,7 @@ namespace Mono.CSharp { case Binary.Operator.RightShift: IntConstant sic = right.ConvertImplicitly (TypeManager.int32_type) as IntConstant; if (sic == null){ - Binary.Error_OperatorCannotBeApplied (loc, ">>", lt, rt); + Binary.Error_OperatorCannotBeApplied (left, right, oper, loc); ; return null; } int rshift_val = sic.Value; @@ -822,7 +822,7 @@ namespace Mono.CSharp { if (left.Type == TypeManager.int32_type) return new IntConstant (((IntConstant)left).Value >> rshift_val, left.Location); - Binary.Error_OperatorCannotBeApplied (loc, ">>", lt, rt); + Binary.Error_OperatorCannotBeApplied (left, right, oper, loc); break; case Binary.Operator.Equality: