[mcs] Move type constraints checks after base type definition. Fixes #44212
authorMarek Safar <marek.safar@gmail.com>
Wed, 14 Sep 2016 13:40:11 +0000 (15:40 +0200)
committerMarek Safar <marek.safar@gmail.com>
Wed, 14 Sep 2016 13:42:26 +0000 (15:42 +0200)
mcs/mcs/class.cs
mcs/mcs/expression.cs
mcs/mcs/statement.cs
mcs/tests/gtest-638.cs [new file with mode: 0644]
mcs/tests/test-partial-35.cs [new file with mode: 0644]
mcs/tests/ver-il-net_4_x.xml

index 3bcaf26e36f5aac24a8d3bdb39599aef25370dcb..e5d0b1f173584fe1676d1379efa1df8a35346731 100644 (file)
@@ -297,6 +297,10 @@ namespace Mono.CSharp
                                                throw new InternalErrorException (tc, e);
                                        }
                                }
+
+                               if (PartialContainer != null && PartialContainer != this) {
+                                       containers = null;
+                               }
                        }
 
                        return true;
@@ -1661,6 +1665,8 @@ namespace Mono.CSharp
 
                public override void ExpandBaseInterfaces ()
                {
+                       DoResolveTypeParameters ();
+
                        if (!IsPartialPart)
                                DoExpandBaseInterfaces ();
 
@@ -1766,8 +1772,6 @@ namespace Mono.CSharp
                protected override void DoDefineContainer ()
                {
                        DefineBaseTypes ();
-
-                       DoResolveTypeParameters ();
                }
 
                //
index 2a9aa97fed0e62be46728b7c4dccb871de0ff0cc..db50ba39b8e9b2642e53e57951b1402edd637d4f 100644 (file)
@@ -12353,6 +12353,7 @@ namespace Mono.CSharp
                        int errors = ec.Report.Errors;
                        type.CreateContainer ();
                        type.DefineContainer ();
+                       type.ExpandBaseInterfaces ();
                        type.Define ();
                        if ((ec.Report.Errors - errors) == 0) {
                                parent.Module.AddAnonymousType (type);
index 7f54b33eeb599c16146c7adfcc0c2e12b3d5beaf..6b658945ff30c30261efeadb5015965883c92a6a 100644 (file)
@@ -3258,6 +3258,7 @@ namespace Mono.CSharp {
                        //
                        storey.CreateContainer ();
                        storey.DefineContainer ();
+                       storey.ExpandBaseInterfaces ();
 
                        if (Original.Explicit.HasCapturedThis && Original.ParametersBlock.TopBlock.ThisReferencesFromChildrenBlock != null) {
 
diff --git a/mcs/tests/gtest-638.cs b/mcs/tests/gtest-638.cs
new file mode 100644 (file)
index 0000000..cadf272
--- /dev/null
@@ -0,0 +1,17 @@
+class X<T1, T2, U>
+       where T1 : class, T2
+       where T2 : class
+       where U : A, T1
+{
+}
+
+class A
+{
+}
+
+class F
+{
+       public static void Main ()
+       {
+       }
+}
\ No newline at end of file
diff --git a/mcs/tests/test-partial-35.cs b/mcs/tests/test-partial-35.cs
new file mode 100644 (file)
index 0000000..ba51245
--- /dev/null
@@ -0,0 +1,19 @@
+partial class A
+{
+}
+
+partial class A
+{
+       enum E
+       {
+               None = 0,
+               All = 1
+       }
+}
+
+class X
+{
+       public static void Main ()
+       {
+       }
+}
\ No newline at end of file
index 67147f16a7725c577a9bc49dba24b87f69d56296..5d65a14e47979efc27d2accaa0b8f36367c611c2 100644 (file)
       </method>
     </type>
   </test>
+  <test name="gtest-638.cs">
+    <type name="X`3[T1,T2,U]">
+      <method name="Void .ctor()" attrs="6278">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="A">
+      <method name="Void .ctor()" attrs="6278">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="F">
+      <method name="Void Main()" attrs="150">
+        <size>2</size>
+      </method>
+      <method name="Void .ctor()" attrs="6278">
+        <size>7</size>
+      </method>
+    </type>
+  </test>
   <test name="gtest-anontype-01.cs">
     <type name="Test">
       <method name="Int32 Main()" attrs="150">
       </method>
     </type>
   </test>
+  <test name="test-partial-35.cs">
+    <type name="A">
+      <method name="Void .ctor()" attrs="6278">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="X">
+      <method name="Void Main()" attrs="150">
+        <size>2</size>
+      </method>
+      <method name="Void .ctor()" attrs="6278">
+        <size>7</size>
+      </method>
+    </type>
+  </test>
   <test name="test-pattern-01.cs">
     <type name="TypePattern">
       <method name="Int32 Main()" attrs="150">