2008-01-08 Marek Safar <marek.safar@gmail.com>
authorMarek Safar <marek.safar@gmail.com>
Wed, 9 Jan 2008 18:52:20 +0000 (18:52 -0000)
committerMarek Safar <marek.safar@gmail.com>
Wed, 9 Jan 2008 18:52:20 +0000 (18:52 -0000)
A fix for bug #352536
  * ecore.cs, assign.cs, codegen.cs: Check event assignments.

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

mcs/mcs/ChangeLog
mcs/mcs/assign.cs
mcs/mcs/codegen.cs
mcs/mcs/ecore.cs

index 93d854db1f48fd11fb1cf1b32a4ede37f7e3a139..098a8f334519df006370ee3aab789e5afc95eded 100644 (file)
@@ -1,3 +1,8 @@
+2008-01-08  Marek Safar  <marek.safar@gmail.com>
+
+       A fix for bug #352536
+       * ecore.cs, assign.cs, codegen.cs: Check event assignments.
+
 2008-01-08  Marek Safar  <marek.safar@gmail.com>
 
        A fix for bug #352287
index bc7b426e155abc909189ce8321cf18c4c72790c7..693683e5383436291fa0a399e3bde260a5f9ffcf 100644 (file)
@@ -688,7 +688,10 @@ namespace Mono.CSharp {
                        if (original_source == null)
                                return null;
 
-                       target = target.Resolve (ec);
+                       using (ec.Set (EmitContext.Flags.InCompoundAssignment)) {
+                               target = target.Resolve (ec);
+                       }
+                       
                        if (target == null)
                                return null;
 
index fc10a38b08e3aa04e379541c57a7aaf131a17250..af57f0f9a717474010dcfc76972972dbc59dc82e 100644 (file)
@@ -283,7 +283,9 @@ namespace Mono.CSharp {
                        //
                        InFieldInitializer = 1 << 8,
                        
-                       InferReturnType = 1 << 9
+                       InferReturnType = 1 << 9,
+                       
+                       InCompoundAssignment = 1 << 10
                }
 
                Flags flags;
@@ -581,6 +583,10 @@ namespace Mono.CSharp {
                public bool IsInFieldInitializer {
                        get { return (flags & Flags.InFieldInitializer) != 0; }
                }
+               
+               public bool IsInCompoundAssignment {
+                       get { return (flags & Flags.InCompoundAssignment) != 0; }
+               }               
 
                public FlowBranching CurrentBranching {
                        get { return current_flow_branching; }
index 096a7055e4a96618ee3e8db09c3b1fe472824b91..353ebc54c35e9de33f1da7249e907e735945bbfc 100644 (file)
@@ -5263,6 +5263,12 @@ namespace Mono.CSharp {
                                return EventInfo.DeclaringType;
                        }
                }
+               
+               void Error_AssignmentEventOnly ()
+               {
+                       Report.Error (79, loc, "The event `{0}' can only appear on the left hand side of `+=' or `-=' operator",
+                               GetSignatureForError ());
+               }
 
                public override MemberExpr ResolveMemberAccess (EmitContext ec, Expression left, Location loc,
                                                                SimpleName original)
@@ -5279,6 +5285,9 @@ namespace Mono.CSharp {
                                        if (!ec.IsInObsoleteScope)
                                                mi.CheckObsoleteness (loc);
 
+                                       if ((mi.ModFlags & (Modifiers.ABSTRACT | Modifiers.EXTERN)) != 0 && !ec.IsInCompoundAssignment)
+                                               Error_AssignmentEventOnly ();
+                                       
                                        FieldExpr ml = new FieldExpr (mi.FieldBuilder, loc);
 
                                        InstanceExpression = null;
@@ -5286,6 +5295,9 @@ namespace Mono.CSharp {
                                        return ml.ResolveMemberAccess (ec, left, loc, original);
                                }
                        }
+                       
+                       if (left is This && !ec.IsInCompoundAssignment)                 
+                               Error_AssignmentEventOnly ();
 
                        return base.ResolveMemberAccess (ec, left, loc, original);
                }
@@ -5357,11 +5369,8 @@ namespace Mono.CSharp {
 
                public override void Emit (EmitContext ec)
                {
-                       if (InstanceExpression is This)
-                               Report.Error (79, loc, "The event `{0}' can only appear on the left hand side of += or -=", GetSignatureForError ());
-                       else
-                               Report.Error (70, loc, "The event `{0}' can only appear on the left hand side of += or -= "+
-                                             "(except on the defining type)", Name);
+                       Report.Error (70, loc, "The event `{0}' can only appear on the left hand side of += or -= "+
+                                     "(except on the defining type)", GetSignatureForError ());
                }
 
                public override string GetSignatureForError ()