Correctly type fixed buffer wrapper type. Fixes #10803
authorMarek Safar <marek.safar@gmail.com>
Fri, 8 Mar 2013 22:45:13 +0000 (23:45 +0100)
committerMarek Safar <marek.safar@gmail.com>
Fri, 8 Mar 2013 22:46:27 +0000 (23:46 +0100)
mcs/errors/cs0029-33.cs [new file with mode: 0644]
mcs/errors/cs0131-5.cs [new file with mode: 0644]
mcs/mcs/ecore.cs
mcs/mcs/field.cs
mcs/mcs/import.cs

diff --git a/mcs/errors/cs0029-33.cs b/mcs/errors/cs0029-33.cs
new file mode 100644 (file)
index 0000000..6e2149a
--- /dev/null
@@ -0,0 +1,17 @@
+// CS0029: Cannot implicitly convert type `char' to `char*'
+// Line: 15
+// Compiler options: -unsafe
+
+unsafe struct MyStruct
+{
+       public fixed char Name[32];
+}
+
+unsafe class MainClass
+{
+       public static void Main ()
+       {
+               var str = new MyStruct ();
+               str.Name = default (char);
+       }
+}
diff --git a/mcs/errors/cs0131-5.cs b/mcs/errors/cs0131-5.cs
new file mode 100644 (file)
index 0000000..f630070
--- /dev/null
@@ -0,0 +1,17 @@
+// CS0131: The left-hand side of an assignment must be a variable, a property or an indexer
+// Line: 15
+// Compiler options: -unsafe
+
+unsafe struct MyStruct
+{
+       public fixed char Name[32];
+}
+
+unsafe class MainClass
+{
+       public static void Main ()
+       {
+               var str = new MyStruct();
+               str.Name = null;
+       }
+}
index 0716e7f1f7e81d5861e3ba53ab556609459382cc..720a4307a2bedadc97ad6dbae9169b9eb2c89f92 100644 (file)
@@ -5611,6 +5611,11 @@ namespace Mono.CSharp {
                
                override public Expression DoResolveLValue (ResolveContext ec, Expression right_side)
                {
+                       if (spec is FixedFieldSpec) {
+                               // It could be much better error message but we want to be error compatible
+                               Error_ValueAssignment (ec, right_side);
+                       }
+
                        Expression e = DoResolve (ec, right_side);
 
                        if (e == null)
index 46ca117aa42d80d473808aa27124d603a9f60090..3b0f76d34eeb3ff1ed7afdca188b6ec284617da9 100644 (file)
@@ -429,7 +429,7 @@ namespace Mono.CSharp
                        FieldBuilder = Parent.TypeBuilder.DefineField (Name, fixed_buffer_type, ModifiersExtensions.FieldAttr (ModFlags));
 
                        var element_spec = new FieldSpec (null, this, MemberType, ffield, ModFlags);
-                       spec = new FixedFieldSpec (Parent.Definition, this, FieldBuilder, element_spec, ModFlags);
+                       spec = new FixedFieldSpec (Module, Parent.Definition, this, FieldBuilder, element_spec, ModFlags);
 
                        Parent.MemberCache.AddMember (spec);
                        return true;
@@ -534,8 +534,8 @@ namespace Mono.CSharp
        {
                readonly FieldSpec element;
 
-               public FixedFieldSpec (TypeSpec declaringType, IMemberDefinition definition, FieldInfo info, FieldSpec element, Modifiers modifiers)
-                       : base (declaringType, definition, element.MemberType, info, modifiers)
+               public FixedFieldSpec (ModuleContainer module, TypeSpec declaringType, IMemberDefinition definition, FieldInfo info, FieldSpec element, Modifiers modifiers)
+                       : base (declaringType, definition, PointerContainer.MakeType (module, element.MemberType), info, modifiers)
                {
                        this.element = element;
 
@@ -548,10 +548,10 @@ namespace Mono.CSharp
                                return element;
                        }
                }
-
+               
                public TypeSpec ElementType {
                        get {
-                               return MemberType;
+                               return element.MemberType;
                        }
                }
        }
index f1c87e04dff1e9d038a6e74f72742542f48ccb3e..6fe8770f6fa6b75fcc75eca8ff65110b25d35557 100644 (file)
@@ -220,7 +220,7 @@ namespace Mono.CSharp
 
                                        // TODO: Sanity check on field_type (only few types are allowed)
                                        var element_field = CreateField (fi.FieldType.GetField (FixedField.FixedElementName), declaringType);
-                                       return new FixedFieldSpec (declaringType, definition, fi, element_field, mod);
+                                       return new FixedFieldSpec (module, declaringType, definition, fi, element_field, mod);
                                }
                        }