[svn] r7077: nemerle/trunk/ncc: testsuite/positive/casts.n typing/Typer.n

nazgul svnadmin at nemerle.org
Sun Dec 10 20:57:42 CET 2006


Log:
Always lookup conversion operators when :> is used

Author: nazgul
Date: Sun Dec 10 20:57:39 2006
New Revision: 7077

Modified:
   nemerle/trunk/ncc/testsuite/positive/casts.n
   nemerle/trunk/ncc/typing/Typer.n

Modified: nemerle/trunk/ncc/testsuite/positive/casts.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/casts.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/casts.n	Sun Dec 10 20:57:39 2006
@@ -27,8 +27,24 @@
   }
 }
 
+namespace Bug806 {
+  class Op
+  {}
+
+  class ExtOp: Op {
+    public static @:>(_: Op): ExtOp { ExtOp() }
+  }
+
+  module Check {
+    public Run () : void {
+      _ = Op() :> ExtOp
+    }
+  }
+}
+
 module Test {
   Main() : int {
+    Bug806.Check.Run ();
     ExplicitOperator.blah.Run ();
   }
 }

Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n	(original)
+++ nemerle/trunk/ncc/typing/Typer.n	Sun Dec 10 20:57:39 2006
@@ -3102,16 +3102,6 @@
           | None => expr.Type
         }
 
-      if (to.TryRequire (from)) {
-        to.ForceRequire (from);
-        TExpr.TypeConversion (expr, to, ConversionKind.DownCast ());
-      } else if (from.TryRequire (to)) {
-        from.ForceRequire (to);
-        Message.Warning (10001, $"there is no check needed to cast $from to $to");
-        Message.HintOnce (10001, "consider using : instead of :>");
-
-        TExpr.TypeConversion (expr, to, ConversionKind.UpCast ())
-      } else {
         def get_convertion_operators (t) {
           $[(t, x) | x in 
                        LookupStaticMethod (t, "op_Explicit") +
@@ -3166,7 +3156,18 @@
                                     ConversionKind.MethodCall (sr))
             }
           | [] =>
-            if ( (is_strange_type (from) || is_strange_type (to))
+          if (to.TryRequire (from)) {
+            to.ForceRequire (from);
+            TExpr.TypeConversion (expr, to, ConversionKind.DownCast ());
+          } 
+          else if (from.TryRequire (to)) {
+            from.ForceRequire (to);
+            Message.Warning (10001, $"there is no check needed to cast $from to $to");
+            Message.HintOnce (10001, "consider using : instead of :>");
+    
+            TExpr.TypeConversion (expr, to, ConversionKind.UpCast ())
+          } 
+          else if ( (is_strange_type (from) || is_strange_type (to))
                 && !is_void (from) && !is_void (to) ) {
               TExpr.TypeConversion (expr, to, ConversionKind.DownCast ())
             } else if (is_enum (from) && is_enum (to)) {
@@ -3186,7 +3187,6 @@
             TExpr.Error ()
         }
       }
-    }
     #endregion
 
 



More information about the svn mailing list