2004-05-24 Martin Baulig <martin@ximian.com>
[mono.git] / mcs / mcs / statement.cs
index 2cc5e325ee5b5ceae201b07259fc12b4f146fa48..203e61d58bf9c0fc51f3aeecf25aaeace77b483e 100755 (executable)
@@ -1739,11 +1739,16 @@ namespace Mono.CSharp {
                                Statement s = (Statement) statements [ix];
 
                                if (unreachable && !(s is LabeledStatement)) {
+                                       if (s == EmptyStatement.Value)
+                                               s.loc = EndLocation;
+
                                        if (!s.ResolveUnreachable (ec, !warning_shown))
                                                ok = false;
 
                                        if (s != EmptyStatement.Value)
                                                warning_shown = true;
+                                       else
+                                               s.loc = Location.Null;
 
                                        statements [ix] = EmptyStatement.Value;
                                        continue;
@@ -3412,7 +3417,7 @@ namespace Mono.CSharp {
                                        converted_vars [i].Emit (ec);
                                        ig.Emit (OpCodes.Callvirt, TypeManager.void_dispose_void);
                                } else {
-                                       Expression ml = Expression.MemberLookup(ec, typeof(IDisposable), var.Type, "Dispose", Mono.CSharp.Location.Null);
+                                       Expression ml = Expression.MemberLookup(ec, TypeManager.idisposable_type, var.Type, "Dispose", Mono.CSharp.Location.Null);
 
                                        if (!(ml is MethodGroupExpr)) {
                                                var.Emit (ec);
@@ -3910,11 +3915,18 @@ namespace Mono.CSharp {
                                if (expr is IMemoryLocation){
                                        IMemoryLocation ml = (IMemoryLocation) expr;
 
-                                       ml.AddressOf (ec, AddressOp.Load);
+                                       Expression ml1 = Expression.MemberLookup(ec, TypeManager.ienumerator_type, expr.Type, "GetEnumerator", Mono.CSharp.Location.Null);
+
+                                       if (!(ml1 is MethodGroupExpr)) {
+                                               expr.Emit(ec);
+                                               ec.ig.Emit(OpCodes.Box, expr.Type);
+                                       } else {
+                                               ml.AddressOf (ec, AddressOp.Load);
+                                       }
                                } else
                                        throw new Exception ("Expr " + expr + " of type " + expr.Type +
                                                             " does not implement IMemoryLocation");
-                               ig.Emit (OpCodes.Call, hm.get_enumerator);
+                               ig.Emit (OpCodes.Callvirt, hm.get_enumerator);
                        } else {
                                expr.Emit (ec);
                                ig.Emit (OpCodes.Callvirt, hm.get_enumerator);