Merge pull request #2869 from BrzVlad/feature-mod-union-opt
[mono.git] / mcs / mcs / class.cs
index 787853a619af95c9efa300fa1d2019915707fa59..bcf7ddffa21cd928e8b8a6cbfb811c2735940f7f 100644 (file)
@@ -92,7 +92,7 @@ namespace Mono.CSharp
                }
 
                //
-               // Any unattached attributes during parsing get added here. User
+               // Any unattached attributes during parsing get added here. Used
                // by FULL_AST mode
                //
                public Attributes UnattachedAttributes {
@@ -530,7 +530,6 @@ namespace Mono.CSharp
 
                bool has_normal_indexers;
                string indexer_name;
-               protected bool requires_delayed_unmanagedtype_check;
                bool error;
                bool members_defined;
                bool members_defined_ok;
@@ -941,7 +940,8 @@ namespace Mono.CSharp
 
                TypeParameterSpec[] ITypeDefinition.TypeParameters {
                        get {
-                               return PartialContainer.CurrentTypeParameters.Types;
+                               var ctp = PartialContainer.CurrentTypeParameters;
+                               return ctp == null ? TypeParameterSpec.EmptyTypes : ctp.Types;
                        }
                }
 
@@ -1999,15 +1999,6 @@ namespace Mono.CSharp
                                CheckPairedOperators ();
                        }
 
-                       if (requires_delayed_unmanagedtype_check) {
-                               requires_delayed_unmanagedtype_check = false;
-                               foreach (var member in members) {
-                                       var f = member as Field;
-                                       if (f != null && f.MemberType != null && f.MemberType.IsPointer)
-                                               TypeManager.VerifyUnmanaged (Module, f.MemberType, f.Location);
-                               }
-                       }
-
                        ComputeIndexerName();
 
                        if (HasEquals && !HasGetHashCode) {
@@ -2711,6 +2702,22 @@ namespace Mono.CSharp
                        return true;
                }
 
+               public override void PrepareEmit ()
+               {
+                       var s = this as Struct;
+                       if (s == null || !s.HasUnmanagedCheckDone) {
+                               for (int i = 0; i < Members.Count; ++i) {
+                                       var f = Members [i] as Field;
+                                       if (f == null || f.MemberType == null || !f.MemberType.IsPointer)
+                                               continue;
+
+                                       TypeManager.VerifyUnmanaged (Module, f.MemberType, f.Location);
+                               }
+                       }
+
+                       base.PrepareEmit ();
+               }
+
                public override void Emit ()
                {
                        if (!has_static_constructor && HasStaticFieldInitializer) {
@@ -2959,7 +2966,7 @@ namespace Mono.CSharp
 
        public sealed class Struct : ClassOrStruct
        {
-               bool is_unmanaged, has_unmanaged_check_done;
+               bool is_unmanaged, has_unmanaged_check_done, requires_delayed_unmanagedtype_check;
                bool InTransit;
 
                // <summary>
@@ -3089,6 +3096,12 @@ namespace Mono.CSharp
                        base.Emit ();
                }
 
+               public bool HasUnmanagedCheckDone {
+                       get {
+                               return has_unmanaged_check_done;
+                       }
+               }
+
                bool HasUserDefaultConstructor ()
                {
                        foreach (var m in PartialContainer.Members) {