[svn] r7034: nemerle/trunk/ncc: testsuite/positive/overloading.n
typing/Typer-DelayedTyping.n typing/Typer...
malekith
svnadmin at nemerle.org
Fri Dec 1 14:24:00 CET 2006
Log:
Put a constrain 'need member foo' if 'foo' is accessed on overloaded value. Resolves #723.
Author: malekith
Date: Fri Dec 1 14:23:59 2006
New Revision: 7034
Modified:
nemerle/trunk/ncc/testsuite/positive/overloading.n
nemerle/trunk/ncc/typing/Typer-DelayedTyping.n
nemerle/trunk/ncc/typing/Typer.n
Modified: nemerle/trunk/ncc/testsuite/positive/overloading.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/overloading.n (original)
+++ nemerle/trunk/ncc/testsuite/positive/overloading.n Fri Dec 1 14:23:59 2006
@@ -79,6 +79,22 @@
public this (_ : object) { printf("743x.object\n"); }
}
+namespace Bug723 {
+class X1
+{
+ public M() : void {}
+}
+
+class X2
+{
+ public X1 : X1 = X1();
+ public K() : void
+ {
+ X1.M()
+ }
+}
+}
+
module M {
foo (_ : array [string]) : void { }
foo (_ : array [object]) : void { assert (false) }
Modified: nemerle/trunk/ncc/typing/Typer-DelayedTyping.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer-DelayedTyping.n (original)
+++ nemerle/trunk/ncc/typing/Typer-DelayedTyping.n Fri Dec 1 14:23:59 2006
@@ -262,6 +262,35 @@
}
}
+ public ExpectMember (name : string) : void
+ {
+ def can_have (_ : MType) {
+ | Class (tc, _) => ! (tc.LookupMember (name) is [])
+ | Array (_, n) => ! (InternalType.GetArrayType (n).LookupMember (name) is [])
+ | TyVarRef (tv) => tv.Constraints.Exists (can_have)
+ | Intersection (lst) => lst.Exists (can_have)
+ | Tuple | Fun | Void | Ref | Out => false
+ }
+
+ match (DtKind) {
+ | Kind.Overloaded (lst) =>
+ when (InternalType.Object_tc.LookupMember (name) is []) {
+ // otherwise it's pointless
+ def newlst = List.RevFilter (lst, fun (o : OverloadPossibility) {
+ match (o.Type.Hint) {
+ | Some (mt) => can_have (mt)
+ | None => true // we don't yet know
+ }
+ });
+
+ if (newlst is []) {}
+ else SetKind (Kind.Overloaded (newlst));
+ }
+
+ | _ => {}
+ }
+ }
+
public IsResolved : bool
{
get {
Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n (original)
+++ nemerle/trunk/ncc/typing/Typer.n Fri Dec 1 14:23:59 2006
@@ -2450,8 +2450,12 @@
: option [list [OverloadPossibility]]
{
def mem_name = name.Id;
- // XXX we should add a bound here, that the type should have the
- // field mem_name
+
+ match (obj) {
+ | Delayed (dt) => dt.ExpectMember (mem_name)
+ | _ => {}
+ }
+
def possible_type =
match (obj.Type.Hint) {
| Some (t) => t
More information about the svn
mailing list