[svn] r6487: nemerle/trunk/ncc: hierarchy/ClassMembers.n testsuite/negative/co-contravariant-native.n

nazgul svnadmin at nemerle.org
Sun Aug 6 15:55:33 CEST 2006


Log:
Correctly invert the variance check

Author: nazgul
Date: Sun Aug  6 15:54:52 2006
New Revision: 6487

Modified:
   nemerle/trunk/ncc/hierarchy/ClassMembers.n
   nemerle/trunk/ncc/testsuite/negative/co-contravariant-native.n

Modified: nemerle/trunk/ncc/hierarchy/ClassMembers.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/ClassMembers.n	(original)
+++ nemerle/trunk/ncc/hierarchy/ClassMembers.n	Sun Aug  6 15:54:52 2006
@@ -917,13 +917,13 @@
             !tr.IsCovariant
           else
             !tr.IsCovariant && !tr.IsContravariant
-        | MType.Array (t, _) => check_variance_valid (t, 1) // array types behave covariantly
+        | MType.Array (t, _) => check_variance_valid (t, enforced_variance_sign) // array types behave covariantly
         | MType.Class (tc, args) =>
           List.ForAll2 (tc.Typarms, args, fun (parm, arg) {
             def enforce_sign = if (parm.IsCovariant) 1
               else if (parm.IsContravariant) -1
               else 0;
-            check_variance_valid (arg, enforce_sign)
+            check_variance_valid (arg, enforce_sign * enforced_variance_sign)
           })
         
         | MType.Fun (a,b) => check_variance_valid (a, 0) && check_variance_valid (b, 0)

Modified: nemerle/trunk/ncc/testsuite/negative/co-contravariant-native.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/negative/co-contravariant-native.n	(original)
+++ nemerle/trunk/ncc/testsuite/negative/co-contravariant-native.n	Sun Aug  6 15:54:52 2006
@@ -10,4 +10,18 @@
   MeGene ['a] (x : int) : void where 'a : P; // E: constraints of generic parameters of method `MeGene' must behave contravariantly
 }
 
+public interface ICovariantEnumerator [+T]
+{
+  MoveNext () : bool;
+  Current : T { get; }
+}
+
+public interface ICovariantEnumerable [+T]
+{
+  GetEnumerator () : ICovariantEnumerator [T];
+  SetEnumerator(e : ICovariantEnumerator [T]) : void; // E: type of `SetEnumerator' method's parameter `e' must behave contravariantly
+  SetArray (x : array [T]) : void; // E: type of `SetArray' method's parameter `x' must behave contravariantly
+}
+
+
 ()



More information about the svn mailing list