* TabControl.cs: Fix typo, emilinates an unneeded expose event.
[mono.git] / mcs / mcs / statement.cs
index 7c3dd0bfa10bc3e088c4acb1bcc74cbb1b4a1869..421abe5cd86231b63abb0fc18fb0016c21c5669e 100644 (file)
@@ -530,7 +530,8 @@ namespace Mono.CSharp {
 
                public override bool Resolve (EmitContext ec)
                {
-                       expr = expr.ResolveStatement (ec);
+                       if (expr != null)
+                               expr = expr.ResolveStatement (ec);
                        return expr != null;
                }
                
@@ -579,6 +580,12 @@ namespace Mono.CSharp {
                                        return false;
                                }
 
+                               if (ec.InIterator) {
+                                       Report.Error (1622, loc, "Cannot return a value from iterators. Use the yield return " +
+                                               "statement to return a value, or yield break to end the iteration");
+                                       return false;
+                               }
+
                                Expr = Expr.Resolve (ec);
                                if (Expr == null)
                                        return false;
@@ -1501,9 +1508,16 @@ namespace Mono.CSharp {
                        if (variables == null)
                                variables = new Hashtable ();
 
+                       Block cur = this;
+                       while (cur != null && cur.Implicit)
+                               cur = cur.Parent;
+
                        LocalInfo vi = GetLocalInfo (name);
                        if (vi != null) {
-                               if (vi.Block != this)
+                               Block var = vi.Block;
+                               while (var != null && var.Implicit)
+                                       var = var.Parent;
+                               if (var != cur)
                                        Report.Error (136, l, "A local variable named `" + name + "' " +
                                                      "cannot be declared in this scope since it would " +
                                                      "give a different meaning to `" + name + "', which " +
@@ -1542,9 +1556,6 @@ namespace Mono.CSharp {
                        variables.Add (name, vi);
 
                        // Mark 'name' as "used by a child block" in every surrounding block
-                       Block cur = this;
-                       while (cur != null && cur.Implicit) 
-                               cur = cur.Parent;
                        if (cur != null)
                                for (Block par = cur.Parent; par != null; par = par.Parent)
                                        par.AddChildVariableName (name);
@@ -1637,10 +1648,7 @@ namespace Mono.CSharp {
                                        
                                        par = pars.GetParameterByName (name, out idx);
                                        if (par != null){
-                                               ParameterReference pr;
-
-                                               pr = new ParameterReference (pars, this, idx, name, loc);
-                                               return pr;
+                                               return new ParameterReference (pars, this, idx, name, loc);
                                        }
                                }
                                b = b.Parent;