# HG changeset patch # User Anders Johnsen # Date 1209756078 -7200 # Node ID 29f486ccc203dd000e110914f63e9afe1d312bd2 # Parent 9375bd975730a66745c5fdb5a465e4b1517b5059 Fixed a bug that made arrays as params fail big time diff -r 9375bd975730 -r 29f486ccc203 ast/Decl.d --- a/ast/Decl.d Fri May 02 20:18:50 2008 +0200 +++ b/ast/Decl.d Fri May 02 21:21:18 2008 +0200 @@ -52,10 +52,7 @@ override DType type() { - if(identifier) - return env.find(identifier).type; - else - return env.findType(varType); + return env.find(identifier).type; } Identifier varType, identifier; diff -r 9375bd975730 -r 29f486ccc203 ast/Exp.d --- a/ast/Exp.d Fri May 02 20:18:50 2008 +0200 +++ b/ast/Exp.d Fri May 02 21:21:18 2008 +0200 @@ -69,7 +69,7 @@ Exp simplify() { - if(auto t = cast(DStruct)type) + if(auto t = type.asStruct) { DFunction func_t = cast(DFunction)exp.type(); assert(func_t !is null, "Calling on something that isn't a function"); diff -r 9375bd975730 -r 29f486ccc203 gen/CodeGen.d --- a/gen/CodeGen.d Fri May 02 20:18:50 2008 +0200 +++ b/gen/CodeGen.d Fri May 02 21:21:18 2008 +0200 @@ -83,12 +83,17 @@ Type[] param_types; foreach (i, p; fd.funcArgs) { - DType t = p.env.findType(p.varType); - if(auto st = cast(DStruct)t) + DType t = p.env.find(p.identifier).type; + if(auto st = t.asStruct) { Type pointer = PointerType.Get(llvm(st)); param_types ~= pointer; } + if(auto ar = t.asArray) + { + Type pointer = PointerType.Get(llvm(ar)); + param_types ~= pointer; + } else param_types ~= llvm(t); } @@ -105,13 +110,17 @@ if(i == 0 && fd.sret) llfunc.addParamAttr(0, ParamAttr.StructRet); - DType t = p.env.findType(p.varType); - if(auto st = cast(DStruct)t) + DType t = p.env.find(p.identifier).type; + if(auto st = t.asStruct) { if(i == 0 && fd.sret) continue; llfunc.addParamAttr(i,ParamAttr.ByVal); } + else if(auto ar = t.asArray) + { + llfunc.addParamAttr(i,ParamAttr.ByVal); + } } }; auto visitor = new VisitFuncDecls(registerFunc); @@ -152,6 +161,7 @@ auto func_t = cast(FunctionType)func_tp.elementType(); auto ret_t = func_t.returnType(); + auto bb = llfunc.appendBasicBlock("entry"); b.positionAtEnd(bb); @@ -316,7 +326,7 @@ case ExpType.Identifier: auto identifier = cast(Identifier)exp; auto sym = exp.env.find(identifier); - if(sym.type.isStruct) + if(sym.type.isStruct || sym.type.isArray) return table.find(sym.id.get); else return b.buildLoad(table.find(sym.id.get), sym.id.get); @@ -675,6 +685,8 @@ foreach(param; f.params) if (param.isStruct) params ~= PointerType.Get(llvm(param)); + else if (param.isArray) + params ~= PointerType.Get(llvm(param)); else params ~= llvm(param); diff -r 9375bd975730 -r 29f486ccc203 sema/AstAction.d --- a/sema/AstAction.d Fri May 02 20:18:50 2008 +0200 +++ b/sema/AstAction.d Fri May 02 21:21:18 2008 +0200 @@ -64,7 +64,7 @@ { FuncDecl fd = cast(FuncDecl)func; if(name) - fd.addParam(new Identifier(type.tok), new Identifier(name.tok)); + fd.addParam(handleType(type), new Identifier(name.tok)); else fd.addParam(new Identifier(type.tok)); } diff -r 9375bd975730 -r 29f486ccc203 sema/SymbolTableBuilder.d --- a/sema/SymbolTableBuilder.d Fri May 02 20:18:50 2008 +0200 +++ b/sema/SymbolTableBuilder.d Fri May 02 21:21:18 2008 +0200 @@ -35,14 +35,12 @@ override void visitVarDecl(VarDecl d) { visitExp(d.varType); - if(!d.identifier) - return; + visitExp(d.identifier); if (d.init) visitExp(d.init); d.env.find(d.identifier).type = typeOf(d.varType, d.env); - visitExp(d.identifier); } override void visitStructDecl(StructDecl s) @@ -138,8 +136,6 @@ --need_push; } - if(!d.identifier) - return; auto sc = current(); auto sym = sc.add(d.identifier); d.env = sc;