Update
[mono.git] / mcs / mcs / assign.cs
old mode 100755 (executable)
new mode 100644 (file)
index aecb5d9..4d25f9f
@@ -3,9 +3,10 @@
 //
 // Author:
 //   Miguel de Icaza (miguel@ximian.com)
-//   Martin Baulig (martin@gnome.org)
+//   Martin Baulig (martin@ximian.com)
 //
 // (C) 2001, 2002, 2003 Ximian, Inc.
+// (C) 2004 Novell, Inc
 //
 using System;
 using System.Reflection;
@@ -387,14 +388,19 @@ namespace Mono.CSharp {
                                }
                        }
                        
-                       if (source is New && target_type.IsValueType &&
-                           (target.eclass != ExprClass.IndexerAccess) && (target.eclass != ExprClass.PropertyAccess)){
-                               New n = (New) source;
-
-                               if (n.SetValueTypeVariable (target))
-                                       return n;
-                               else
+                       FieldExpr field_exp = target as FieldExpr;
+                       if (field_exp != null && field_exp.DeclaringType.IsValueType && !ec.IsConstructor && !ec.IsFieldInitializer) {
+                               field_exp = field_exp.InstanceExpression as FieldExpr;
+                               if (field_exp != null && field_exp.FieldInfo.IsInitOnly) {
+                                       if (field_exp.IsStatic) {
+                                               Report.Error (1650, loc, "Members of static readonly field '{0}' cannot be assigned to " +
+                                                       "(except in a static constructor or a variable initializer)", TypeManager.GetFullNameSignature (field_exp.FieldInfo));
+                                       } else {
+                                               Report.Error (1648, loc, "Members of readonly field '{0}' cannot be assigned to " +
+                                                       "(except in a constructor or a variable initializer)", TypeManager.GetFullNameSignature (field_exp.FieldInfo));
+                                       }
                                        return null;
+                               }
                        }
 
                        if (!(target is IAssignMethod) && (target.eclass != ExprClass.EventAccess)) {
@@ -413,9 +419,20 @@ namespace Mono.CSharp {
                                return null;
 
                        }
-                       
-                       if (target_type == source_type)
+
+                       if (target_type == source_type){
+                               if (source is New && target_type.IsValueType &&
+                                   (target.eclass != ExprClass.IndexerAccess) && (target.eclass != ExprClass.PropertyAccess)){
+                                       New n = (New) source;
+                                       
+                                       if (n.SetValueTypeVariable (target))
+                                               return n;
+                                       else
+                                               return null;
+                               }
+                               
                                return this;
+                       }
                        
                        //
                        // If this assignemnt/operator was part of a compound binary