2008-05-01 Marek Safar <marek.safar@gmail.com>
authorMarek Safar <marek.safar@gmail.com>
Thu, 1 May 2008 10:11:39 +0000 (10:11 -0000)
committerMarek Safar <marek.safar@gmail.com>
Thu, 1 May 2008 10:11:39 +0000 (10:11 -0000)
* expression.cs, ecore.cs: Block base access expression inside expression
tree.

svn path=/trunk/mcs/; revision=102265

mcs/mcs/ChangeLog
mcs/mcs/ecore.cs
mcs/mcs/expression.cs

index 21fac967637dd8ffbeb726017801242ad46593b1..1167447524dd799638c152052c829325ad9b70c2 100644 (file)
@@ -1,3 +1,8 @@
+2008-05-01  Marek Safar  <marek.safar@gmail.com>
+
+       * expression.cs, ecore.cs: Block base access expression inside expression
+       tree.
+
 2008-05-01  Marek Safar  <marek.safar@gmail.com>
 
        A fix for bug #385058
index 1e12fd37f9024c5d42a756de1d2060979cd6723e..6502a4d44a49c9b4c22fbf8bae9ea3d89b6ffabe 100644 (file)
@@ -3117,6 +3117,11 @@ namespace Mono.CSharp {
                                      "with an instance reference, qualify it with a type name instead", name);
                }
 
+               public static void Error_BaseAccessInExpressionTree (Location loc)
+               {
+                       Report.Error (831, loc, "An expression tree may not contain a base access");
+               }
+
                // TODO: possible optimalization
                // Cache resolved constant result in FieldBuilder <-> expression map
                public virtual MemberExpr ResolveMemberAccess (EmitContext ec, Expression left, Location loc,
@@ -5095,6 +5100,11 @@ namespace Mono.CSharp {
                                return CreateExpressionFactoryCall ("ArrayLength", args);
                        }
 
+                       if (is_base) {
+                               Error_BaseAccessInExpressionTree (loc);
+                               return null;
+                       }
+
                        // TODO: it's waiting for PropertyExpr refactoring
                        //ArrayList args = new ArrayList (2);
                        //args.Add (new Argument (InstanceExpression.CreateExpressionTree (ec)));
index d71a8cd28d924be569c93fdace77bdbd891f8426..5d904fc3ef9bfd440522d99c99b911ea04e0e9ea 100644 (file)
@@ -2889,8 +2889,10 @@ namespace Mono.CSharp {
                                } else {
                                        union = MethodGroupExpr.MakeUnionSet (left_operators, right_operators, loc);
                                }
+                       } else if (left_operators != null) {
+                               union = left_operators;
                        } else {
-                               union = MethodGroupExpr.MakeUnionSet (left_operators, right_operators, loc);
+                               union = right_operators;
                        }
 
                        union = union.OverloadResolve (ec, ref args, true, loc);
@@ -4609,6 +4611,9 @@ namespace Mono.CSharp {
                                }
                        }
 
+                       if (mg.IsBase)
+                               MemberExpr.Error_BaseAccessInExpressionTree (loc);
+
                        return CreateExpressionFactoryCall ("Call", args);
                }
 
@@ -8552,6 +8557,12 @@ namespace Mono.CSharp {
 
                        return true;
                }
+
+               public override Expression CreateExpressionTree (EmitContext ec)
+               {
+                       MemberExpr.Error_BaseAccessInExpressionTree (loc);
+                       return base.CreateExpressionTree (ec);
+               }
        }
        
        /// <summary>