Updated with Xamarin copyrights
[mono.git] / mcs / mcs / field.cs
index 59a3d3b2629a22315255a4fbc2e3b3372d024681..ec3e050205aebb17a6ada15d3b5adcf288e419f0 100644 (file)
@@ -9,6 +9,7 @@
 //
 // Copyright 2001, 2002, 2003 Ximian, Inc (http://www.ximian.com)
 // Copyright 2004-2008 Novell, Inc
+// Copyright 2011 Xamarin Inc
 //
 
 using System;
@@ -166,7 +167,8 @@ namespace Mono.CSharp
                                return false;
 
                        MemberSpec candidate;
-                       var conflict_symbol = MemberCache.FindBaseMember (this, out candidate);
+                       bool overrides = false;
+                       var conflict_symbol = MemberCache.FindBaseMember (this, out candidate, ref overrides);
                        if (conflict_symbol == null)
                                conflict_symbol = candidate;
 
@@ -237,6 +239,8 @@ namespace Mono.CSharp
                                Report.Error (625, Location, "`{0}': Instance field types marked with StructLayout(LayoutKind.Explicit) must have a FieldOffset attribute", GetSignatureForError ());
                        }
 
+                       ConstraintChecker.Check (this, member_type, type_expr.Location);
+
                        base.Emit ();
                }
 
@@ -567,9 +571,6 @@ namespace Mono.CSharp
 
                bool CanBeVolatile ()
                {
-                       if (TypeManager.IsReferenceType (MemberType))
-                               return true;
-
                        switch (MemberType.BuiltinType) {
                        case BuiltinTypeSpec.Type.Bool:
                        case BuiltinTypeSpec.Type.Char:
@@ -585,6 +586,9 @@ namespace Mono.CSharp
                                return true;
                        }
 
+                       if (TypeSpec.IsReferenceType (MemberType))
+                               return true;
+
                        if (MemberType.IsEnum)
                                return true;
 
@@ -598,7 +602,7 @@ namespace Mono.CSharp
 
                        MetaType[] required_modifier = null;
                        if ((ModFlags & Modifiers.VOLATILE) != 0) {
-                               var mod = Module.PredefinedTypes.IsVolatile.Resolve (Location);
+                               var mod = Module.PredefinedTypes.IsVolatile.Resolve ();
                                if (mod != null)
                                        required_modifier = new MetaType[] { mod.GetMetaInfo () };
                        }
@@ -608,8 +612,11 @@ namespace Mono.CSharp
 
                        spec = new FieldSpec (Parent.Definition, this, MemberType, FieldBuilder, ModFlags);
 
-                       // Don't cache inaccessible fields
-                       if ((ModFlags & Modifiers.BACKING_FIELD) == 0) {
+                       //
+                       // Don't cache inaccessible fields except for struct where we
+                       // need them for definitive assignment checks
+                       //
+                       if ((ModFlags & Modifiers.BACKING_FIELD) == 0 || Parent.Kind == MemberKind.Struct) {
                                Parent.MemberCache.AddMember (spec);
                        }
 
@@ -630,10 +637,6 @@ namespace Mono.CSharp
                                }
                        }
 
-/*
-                       if ((ModFlags & (Modifiers.STATIC | Modifiers.READONLY | Modifiers.COMPILER_GENERATED)) == Modifiers.STATIC)
-                               Console.WriteLine ("{0}: {1}", Location.ToString (), GetSignatureForError ());
-*/
                        return true;
                }