[662440] Don't expand nested type builders of non-generic types
authorMarek Safar <marek.safar@gmail.com>
Wed, 5 Jan 2011 15:44:02 +0000 (15:44 +0000)
committerMarek Safar <marek.safar@gmail.com>
Wed, 5 Jan 2011 15:45:53 +0000 (15:45 +0000)
mcs/mcs/decl.cs
mcs/mcs/method.cs
mcs/tests/gtest-550.cs [new file with mode: 0644]
mcs/tests/ver-il-dmcs.xml

index f92b4579185fa09a7e73390333b98dc71d033e36..8411f2b52c09266e2a6a8cdb6157f6438238d9df 100644 (file)
@@ -1075,7 +1075,8 @@ namespace Mono.CSharp {
                {
                        var inflated = (MemberSpec) MemberwiseClone ();
                        inflated.declaringType = inflator.TypeInstance;
-                       inflated.state |= StateFlags.PendingMetaInflate;
+                       if (DeclaringType.IsGenericOrParentIsGeneric)
+                               inflated.state |= StateFlags.PendingMetaInflate;
 #if DEBUG
                        inflated.ID += 1000000;
 #endif
index 425e31fb41bdffed7b68b95bd87fecf9a62f7521..2af0b7850937880452cd5226450829814e2650a9 100644 (file)
@@ -309,17 +309,19 @@ namespace Mono.CSharp {
                        //
                        if (inflatedMetaInfo == null) {
                                if ((state & StateFlags.PendingMetaInflate) != 0) {
+                                       var dt_meta = DeclaringType.GetMetaInfo ();
+
                                        if (DeclaringType.IsTypeBuilder) {
                                                if (IsConstructor)
-                                                       inflatedMetaInfo = TypeBuilder.GetConstructor (DeclaringType.GetMetaInfo (), (ConstructorInfo) metaInfo);
+                                                       inflatedMetaInfo = TypeBuilder.GetConstructor (dt_meta, (ConstructorInfo) metaInfo);
                                                else
-                                                       inflatedMetaInfo = TypeBuilder.GetMethod (DeclaringType.GetMetaInfo (), (MethodInfo) metaInfo);
+                                                       inflatedMetaInfo = TypeBuilder.GetMethod (dt_meta, (MethodInfo) metaInfo);
                                        } else {
 #if STATIC
                                                // it should not be reached
                                                throw new NotImplementedException ();
 #else
-                                               inflatedMetaInfo = MethodInfo.GetMethodFromHandle (metaInfo.MethodHandle, DeclaringType.GetMetaInfo ().TypeHandle);
+                                               inflatedMetaInfo = MethodInfo.GetMethodFromHandle (metaInfo.MethodHandle, dt_meta.TypeHandle);
 #endif
                                        }
 
diff --git a/mcs/tests/gtest-550.cs b/mcs/tests/gtest-550.cs
new file mode 100644 (file)
index 0000000..a845c12
--- /dev/null
@@ -0,0 +1,61 @@
+using System;
+
+namespace Foo
+{
+       public static class Magic
+       {
+               public interface IUpDown
+               {
+                       int DestinationDimension { get; }
+               }
+
+               public static int Main ()
+               {
+                       Magic<decimal>.Upsample (new Instance ());
+                       return 0;
+               }
+       }
+
+       public static class Magic<T>
+       {
+               public interface IAccessible { T this[int index] { get; set; } }
+
+               public interface IUpDown : Magic.IUpDown, IAccessible { }
+
+               public static void Upsample (IUpDown o)
+               {
+                       var count = o.DestinationDimension;
+               }
+       }
+
+       class Instance : Magic<decimal>.IUpDown
+       {
+               #region IUpDown Members
+
+               public int DestinationDimension
+               {
+                       get
+                       {
+                               return 1;
+                       }
+               }
+
+               #endregion
+
+               #region IAccessible Members
+
+               public decimal this[int index]
+               {
+                       get
+                       {
+                               throw new NotImplementedException ();
+                       }
+                       set
+                       {
+                               throw new NotImplementedException ();
+                       }
+               }
+
+               #endregion
+       }
+}
\ No newline at end of file
index 697171442bde24a56d6a2f1385c3d94c9c02170f..679ab27e60efe87a64f89cd55b6150cd811324ba 100644 (file)
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
     <type name="Tester+&lt;GetIndexError_Null&gt;c__AnonStorey0">
       <method name="Void &lt;&gt;m__0()">
         <size>91</size>
         <size>86</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-046.cs">
     <type name="Foo`1[T]">
         <size>17</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-116.cs">
     <type name="Slow.Test">
         <size>1</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-252.cs">
     <type name="EqualityComparer`1[T]">
       <method name="Void .ctor()">
         <size>7</size>
       </method>
-      <method name="Void Main()">
-        <size>53</size>
+      <method name="Int32 Main()">
+        <size>91</size>
       </method>
     </type>
   </test>
         <size>86</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-372.cs">
     <type name="TestClass`1[T]">
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
     <type name="ConditionalParsing+Const">
       <method name="Void .ctor()">
         <size>7</size>
       </method>
     </type>
   </test>
+  <test name="gtest-417.cs">
+    <type name="Indirect">
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="Base">
+      <method name="IEnumerator System.Collections.IEnumerable.GetEnumerator()">
+        <size>12</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="TestCase">
+      <method name="Int32 Main()">
+        <size>125</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+  </test>
   <test name="gtest-418.cs">
     <type name="N.Nested">
       <method name="Void .ctor()">
         <size>171</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-422.cs">
     <type name="A">
       </method>
     </type>
   </test>
+  <test name="gtest-423.cs">
+    <type name="MonoTest.A`1[TA]">
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="MonoTest.A`1+B`1[TA,TB]">
+      <method name="Void foo()">
+        <size>1</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="MonoTest.A`1+B`1+C[TA,TB]">
+      <method name="Void bar()">
+        <size>16</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="MonoTest.Program">
+      <method name="Void Main()">
+        <size>1</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+  </test>
   <test name="gtest-424.cs">
     <type name="A">
       <method name="Void .ctor()">
         <size>61</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
     <type name="B">
       <method name="Void BaseM()">
         <size>1</size>
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-anon-39.cs">
     <type name="Test">
         <size>16</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
     <type name="Test+&lt;GetItems&gt;c__Iterator0">
       <method name="Void .ctor()">
         <size>7</size>
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
     <type name="TestCase+&lt;Test&gt;c__AnonStorey0`1[T]">
       <method name="Void &lt;&gt;m__0()">
         <size>46</size>
       <method name="Void NewArrayBoundsTest_4()">
         <size>82</size>
       </method>
-    </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
-    <type name="Tester">
       <method name="Void LeftShiftTest_6()">
         <size>155</size>
       </method>
       <method name="Void RightShiftTest_6()">
         <size>145</size>
       </method>
+      <method name="Void TypeAsTest_4()">
+        <size>113</size>
+      </method>
     </type>
   </test>
   <test name="gtest-etree-02.cs">
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-etree-10.cs">
     <type name="Foo`1[T]">
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-etree-11.cs">
     <type name="C">
       </method>
     </type>
   </test>
+  <test name="gtest-etree-26.cs">
+    <type name="A`1[TA]">
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="A`1+B`1[TA,TB]">
+      <method name="Void foo()">
+        <size>39</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="A`1+B`1+C`1[TA,TB,TC]">
+      <method name="Void bar()">
+        <size>6</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="Program">
+      <method name="Int32 Main()">
+        <size>7</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+  </test>
   <test name="gtest-exmethod-01.cs">
     <type name="SimpleTest">
       <method name="System.String Prefix(System.String, System.String)">
         <size>296</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-implicitarray-02.cs">
     <type name="MyString">
         <size>53</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-initialize-10.cs">
     <type name="Foo">
         <size>40</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-iter-10.cs">
     <type name="Test">
       <method name="Int32 Main()">
         <size>559</size>
       </method>
-    </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
-    <type name="TestGroupBy">
       <method name="Int32 &lt;Main&gt;m__0(Int32)">
         <size>4</size>
       </method>
         <size>2</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-linq-18.cs">
     <type name="C">
         <size>142</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
     <type name="C+&lt;Main&gt;c__AnonStorey0">
       <method name="Void .ctor()">
         <size>7</size>
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-optional-13.cs">
     <type name="A">
       </method>
     </type>
   </test>
-  <test name="gtest-repl-01.cs">
-    <type name="MyTest">
-      <method name="Void Run(System.String, System.String)">
-        <size>23</size>
-      </method>
-      <method name="Void Evaluate(System.String, System.String, System.Object)">
-        <size>80</size>
-      </method>
-      <method name="Void Main()">
-        <size>561</size>
-      </method>
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
-  </test>
   <test name="gtest-var-04.cs">
     <type name="Test">
       <method name="Void .ctor()">
         <size>91</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-207.cs">
     <type name="X">
         <size>38</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-233.cs">
     <type name="Tests">
         <size>0</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-260.cs">
     <type name="x.Test">
         <size>269</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
     <type name="FancyInt">
       <method name="Void .ctor(Int32)">
         <size>8</size>
         <size>35</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-360.cs">
     <type name="Application">
         <size>284</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-430.cs">
     <type name="A">
         <size>755</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-450.cs">
     <type name="A">
         <size>39</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-526.cs">
     <type name="Test">
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-54.cs">
     <type name="X">
         <size>145</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-555.cs">
     <type name="Test">
         <size>53</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-696.cs">
     <type name="S">
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-732.cs">
     <type name="C">
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-758.cs">
     <type name="C">
       </method>
     </type>
   </test>
+  <test name="test-803.cs">
+    <type name="A">
+      <method name="Int32 Main()">
+        <size>26</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+  </test>
   <test name="test-81.cs">
     <type name="N1.A">
       <method name="Void .ctor()">
         <size>63</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-89.cs">
     <type name="X">
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-anon-53.cs">
     <type name="Test">
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-anon-64.cs">
     <type name="Source">
         <size>3</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-anon-71.cs">
     <type name="Program">
         <size>247</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
     <type name="X+&lt;GetIt&gt;c__Iterator0">
       <method name="Void .ctor()">
         <size>7</size>
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-iter-22.cs">
     <type name="Test">
         <size>177</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-var-05.cs">
     <type name="MyClass">
       </method>
     </type>
   </test>
+  <test name="test-var-09.cs">
+    <type name="A">
+      <method name="Int32 Main()">
+        <size>12</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+  </test>
   <test name="test-xml-042.cs">
     <type name="TestNamespace.TestClass">
       <method name="Void .ctor()">