Check nested declaring types when testing member overrides
authorMarek Safar <marek.safar@gmail.com>
Tue, 26 Oct 2010 15:47:48 +0000 (16:47 +0100)
committerMarek Safar <marek.safar@gmail.com>
Wed, 27 Oct 2010 07:40:43 +0000 (08:40 +0100)
mcs/errors/gcs0508-3.cs [new file with mode: 0644]
mcs/mcs/class.cs
mcs/mcs/typespec.cs
mcs/tests/gtest-542.cs [new file with mode: 0644]
mcs/tests/ver-il-gmcs.xml

diff --git a/mcs/errors/gcs0508-3.cs b/mcs/errors/gcs0508-3.cs
new file mode 100644 (file)
index 0000000..b30e7b7
--- /dev/null
@@ -0,0 +1,15 @@
+// CS0508: `A<T>.B<H>.Test()': return type must be `A<T>.B<H>' to match overridden member `A<A<T>.B<H>>.Test()'
+// Line: 10
+
+abstract class A<T>
+{
+       public abstract T Test ();
+
+       public class B<H> : A<B<H>>
+       {
+               public override B<H> Test ()
+               {
+                       return this;
+               }
+       }
+}
index 730ec49750b82399c88314620f63232f0108344b..f6e35da4b6abcd8d2137ca5de899469c5cc8fefd 100644 (file)
@@ -2086,7 +2086,13 @@ namespace Mono.CSharp {
                        }
 
                        if (e == null) {
-                               TypeSpec t = LookupNestedTypeInHierarchy (name, arity);
+                               TypeSpec t;
+                               if (false && MemberName.Name == name && MemberName.Arity == arity) {
+                                       t = spec;
+                               } else
+                       {
+                                       t = LookupNestedTypeInHierarchy (name, arity);
+                               }
 
                                if (t != null)
                                        e = new TypeExpression (t, Location.Null);
index 99b8919ef35cf9b80dce99873fa3e795334da6e1..fb7132aa056cfd4a63b8a88b37205c46bf08b025 100644 (file)
@@ -565,21 +565,6 @@ namespace Mono.CSharp
                                        return tp_b != null && tp_a.IsMethodOwned == tp_b.IsMethodOwned && tp_a.DeclaredPosition == tp_b.DeclaredPosition;
                                }
 
-                               if (a.TypeArguments.Length != b.TypeArguments.Length)
-                                       return false;
-
-                               if (a.TypeArguments.Length != 0) {
-                                       if (a.MemberDefinition != b.MemberDefinition)
-                                               return false;
-
-                                       for (int i = 0; i < a.TypeArguments.Length; ++i) {
-                                               if (!IsEqual (a.TypeArguments[i], b.TypeArguments[i]))
-                                                       return false;
-                                       }
-
-                                       return true;
-                               }
-
                                var ac_a = a as ArrayContainer;
                                if (ac_a != null) {
                                        var ac_b = b as ArrayContainer;
@@ -587,9 +572,22 @@ namespace Mono.CSharp
                                }
 
                                if (a == InternalType.Dynamic || b == InternalType.Dynamic)
-                                       return b == TypeManager.object_type || a == TypeManager.object_type;
-
-                               return false;
+                                       return b == TypeManager.object_type || a == TypeManager.object_type;\r
+\r
+                               if (a.MemberDefinition != b.MemberDefinition)\r
+                                       return false;\r
+\r
+                               do {\r
+                                       for (int i = 0; i < a.TypeArguments.Length; ++i) {\r
+                                               if (!IsEqual (a.TypeArguments[i], b.TypeArguments[i]))\r
+                                                       return false;\r
+                                       }\r
+\r
+                                       a = a.DeclaringType;\r
+                                       b = b.DeclaringType;\r
+                               } while (a != null);
+\r
+                               return true;\r
                        }
 
                        //
diff --git a/mcs/tests/gtest-542.cs b/mcs/tests/gtest-542.cs
new file mode 100644 (file)
index 0000000..7737000
--- /dev/null
@@ -0,0 +1,24 @@
+abstract class A<T>
+{
+       public abstract T getT ();
+
+       public class B : A<B>
+       {
+               public override A<T>.B getT ()
+               {
+                       return this;
+               }
+       }
+}
+
+class C
+{
+       static int Main ()
+       {
+               var r = new A<short>.B ();
+               if (r.getT () != r)
+                       return 1;
+               
+               return 0;
+       }
+}
index 91f184a96b0d20592364589cd8fd3fdea4a6dcc1..886642f6574d62c410223e8d7ec96f9eea767acf 100644 (file)
       </method>
     </type>
   </test>
+  <test name="gtest-541.cs">
+    <type name="Foo">
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="Top`1[S]">
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="Top`1+Base`1[S,T]">
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="Top`1+Base`1+Derived`1[S,T,U]">
+      <method name="Void Test()">
+        <size>1</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="Test">
+      <method name="Int32 Main()">
+        <size>14</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+  </test>
+  <test name="gtest-542.cs">
+    <type name="A`1[T]">
+      <method name="T getT()">
+        <size>0</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="A`1+B[T]">
+      <method name="A`1+B[T] getT()">
+        <size>2</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="C">
+      <method name="Int32 Main()">
+        <size>22</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+  </test>
   <test name="gtest-anon-1.cs">
     <type name="X">
       <method name="Void .ctor()">
       </method>
     </type>
   </test>
-  <test name="test-471.cs">
-    <type name="AAttribute">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
-    <type name="Demo">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-      <method name="Void Main()">
-        <size>1</size>
-      </method>
-    </type>
-  </test>
   <test name="test-472.cs">
     <type name="Test">
       <method name="Void .ctor()">
       </method>
     </type>
   </test>
+  <test name="test-629.cs">
+    <type name="Foo">
+      <method name="Void Main()">
+        <size>1</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="Foo+Nested">
+      <method name="Int32 get_Bar()">
+        <size>2</size>
+      </method>
+    </type>
+  </test>
   <test name="test-63.cs">
     <type name="X">
       <method name="Void .ctor()">