# HG changeset patch # User Anders Johnsen # Date 1216736578 -7200 # Node ID 0f38f1a0f06f919acb16a9aa20c0ad381ae2e7db # Parent 0e10479623f61f35840413edfbc677a986406110 Fixed symbol for a functions members. diff -r 0e10479623f6 -r 0f38f1a0f06f ast/Exp.d --- a/ast/Exp.d Tue Jul 22 13:39:15 2008 +0200 +++ b/ast/Exp.d Tue Jul 22 16:22:58 2008 +0200 @@ -387,12 +387,23 @@ if (myType) return myType; - DStruct st = cast(DStruct)target.type; - assert(st, "Only structs have members"); - if (auto t = st.typeOf(child.name)) - myType = t; + if ( target.type.isStruct ) + { + DStruct st = target.type.asStruct; + if (auto t = st.typeOf(child.name)) + myType = t; +// else assert(0, "Referencing non-existant member"); + } + else if ( target.type.isClass ) + { + DClass cl = target.type.asClass; + if (auto t = cl.typeOf(child.name)) + myType = t; +// else assert(0, "Referencing non-existant member"); + } + else + assert(0, "Only structs and classes have members"); // no error reporting here - else assert(0, "Referencing non-existant member"); return myType; } diff -r 0e10479623f6 -r 0f38f1a0f06f sema/ScopeBuilder.d --- a/sema/ScopeBuilder.d Tue Jul 22 13:39:15 2008 +0200 +++ b/sema/ScopeBuilder.d Tue Jul 22 16:22:58 2008 +0200 @@ -30,6 +30,15 @@ visitExp(d.returnType); visitExp(d.identifier); + + d.sym = current.symbol.createMember( + d.identifier.get, + d.type, + d); + + auto old = current.symbol; + current.symbol = d.sym; + foreach (arg; d.funcArgs) visitDecl(arg); @@ -40,10 +49,8 @@ inFunctionBodyStack.pop(); - d.sym = current.symbol.createMember( - d.identifier.get, - d.type, - d); + current.symbol = old; + } override void visitVarDecl(VarDecl d) diff -r 0e10479623f6 -r 0f38f1a0f06f sema/Visitor.d --- a/sema/Visitor.d Tue Jul 22 13:39:15 2008 +0200 +++ b/sema/Visitor.d Tue Jul 22 16:22:58 2008 +0200 @@ -263,9 +263,12 @@ StmtT visitForStmt(ForStmt s) { - visitStmt(s.init); - visitExp(s.cond); - visitExp(s.incre); + if(s.init) + visitStmt(s.init); + if(s.cond) + visitExp(s.cond); + if(s.incre) + visitExp(s.incre); visitStmt(s.forBody); static if (is(StmtT == void)) return; diff -r 0e10479623f6 -r 0f38f1a0f06f tests/parser/new_1.d --- a/tests/parser/new_1.d Tue Jul 22 13:39:15 2008 +0200 +++ b/tests/parser/new_1.d Tue Jul 22 16:22:58 2008 +0200 @@ -8,6 +8,8 @@ this(int y) { } + + int x; } struct B @@ -18,5 +20,5 @@ { B b; long x; - A a = new A(b); + A a = new A(x); }