# HG changeset patch # User Anders Johnsen # Date 1216926402 -7200 # Node ID 20ff3c31f6003573629f4eeb81521bf24925a684 # Parent 50b98a06a200c296e84edebffcde08b30630dd5b Putting symbol on MemberRef -calls. diff -r 50b98a06a200 -r 20ff3c31f600 gen/CodeGen.d --- a/gen/CodeGen.d Thu Jul 24 20:40:04 2008 +0200 +++ b/gen/CodeGen.d Thu Jul 24 21:06:42 2008 +0200 @@ -368,6 +368,7 @@ DFunction ftype = type.asFunction(); Type llvm_ftype = llvm(ftype); Value f = null; + Stdout(callExp.callSym).newline; if (callExp.callSym is null) { // Do a virtual function call diff -r 50b98a06a200 -r 20ff3c31f600 sema/TypeCheck.d --- a/sema/TypeCheck.d Thu Jul 24 20:40:04 2008 +0200 +++ b/sema/TypeCheck.d Thu Jul 24 21:06:42 2008 +0200 @@ -88,7 +88,80 @@ { super.visitCallExp(exp); - if (auto iden = cast(Identifier)exp.exp) + Stdout(exp.exp).newline; + if (auto iden = cast(MemberReference)exp.exp) + { + Symbol[] internalVisitMemberRef(MemberReference m) + { + Symbol[] visitRef(MemberReference m, Identifier target, Symbol st) + { + auto child = m.child; + auto res = st.findMembers(child.get); + return res; + } + switch(m.target.expType) + { + case ExpType.Identifier: + return visitRef(m, cast(Identifier)m.target, + (cast(Identifier)m.target).getSymbol); + case ExpType.MemberReference: + Symbol[] s = internalVisitMemberRef(cast(MemberReference)m.target); + if(s.length) + return s; + return visitRef(m, cast(Identifier)m.target, s[0]); + } + } + + Exp[] newArgs; + + Symbol[] methods = internalVisitMemberRef(iden); + + if (!methods.length) + { + messages.report(NoMethodByName, iden.loc); + return; + } + + Symbol sel = getBestMatch(exp.args, methods); + + if (sel) + { + foreach (i, arg; exp.args) + { + auto argType = sel.type.asFunction.params[i]; + auto expType = arg.type; + if (argType.byteSize != expType.byteSize) + { + if (!expType.hasImplicitConversionTo(argType)) + messages.report(InvalidImplicitCast, exp.loc) + .arg(expType.toString) + .arg(argType.toString); + + auto castExp = new CastExp( + SLoc.Invalid, + new Identifier(argType.name), + arg); + castExp.env = iden.env; + newArgs ~= castExp; + } + else + newArgs ~= arg; + } + exp.args = newArgs; + exp.callSym = sel; + } + else + { + messages.report(NoMachingMethod, exp.loc); + foreach ( i, s ; methods ) + { + messages.report(CandidateNr, + (cast(FuncDecl)s.decl).identifier.loc) + .arg(Integer.toString(i+1)); + } + } + } + else if (auto iden = cast(Identifier)exp.exp) { Exp[] newArgs; @@ -141,7 +214,6 @@ .arg(Integer.toString(i+1)); } } - } else { diff -r 50b98a06a200 -r 20ff3c31f600 tests/code/struct_6.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/code/struct_6.d Thu Jul 24 21:06:42 2008 +0200 @@ -0,0 +1,14 @@ + +struct A +{ + int foo() + { + return 5; + } +} + +int main() +{ + A a; + return a.foo(); +}