# HG changeset patch # User Anders Johnsen # Date 1209750718 -7200 # Node ID 06dda301ea61263046d6f4074e686d4990223959 # Parent 110c7e1c4ca2f71a048a787108a86be2a4b23f0d Can declare outside functions and call c-functions diff -r 110c7e1c4ca2 -r 06dda301ea61 ast/Decl.d --- a/ast/Decl.d Fri May 02 18:23:33 2008 +0200 +++ b/ast/Decl.d Fri May 02 19:51:58 2008 +0200 @@ -52,7 +52,10 @@ override DType type() { - return env.find(identifier).type; + if(identifier) + return env.find(identifier).type; + else + return env.findType(varType); } Identifier varType, identifier; @@ -68,7 +71,7 @@ this.identifier = identifier; } - void addParam(Identifier type, Identifier name) + void addParam(Identifier type, Identifier name = null) { funcArgs ~= new VarDecl(type, name, null); } @@ -76,6 +79,7 @@ void setBody(CompoundStatement stmts) { statements = stmts.statements; + emptyFunction = false; } void simplify() @@ -129,6 +133,7 @@ VarDecl[] funcArgs; Stmt[] statements; bool sret = false; + bool emptyFunction = true; private DFunction myType; } diff -r 110c7e1c4ca2 -r 06dda301ea61 gen/CodeGen.d --- a/gen/CodeGen.d Fri May 02 18:23:33 2008 +0200 +++ b/gen/CodeGen.d Fri May 02 19:51:58 2008 +0200 @@ -83,7 +83,7 @@ Type[] param_types; foreach (i, p; fd.funcArgs) { - DType t = p.env.find(p.identifier).type; + DType t = p.env.findType(p.varType); if(auto st = cast(DStruct)t) { Type pointer = PointerType.Get(llvm(st)); @@ -105,7 +105,7 @@ if(i == 0 && fd.sret) llfunc.addParamAttr(0, ParamAttr.StructRet); - DType t = p.env.find(p.identifier).type; + DType t = p.env.findType(p.varType); if(auto st = cast(DStruct)t) { if(i == 0 && fd.sret) @@ -142,6 +142,10 @@ case DeclType.FuncDecl: FuncDecl funcDecl = cast(FuncDecl)decl; + // Empty function - declare; + if(funcDecl.emptyFunction) + return; + llvm(funcDecl.type); auto llfunc = m.getNamedFunction(funcDecl.type.name); auto func_tp = cast(PointerType)llfunc.type; diff -r 110c7e1c4ca2 -r 06dda301ea61 parser/Parser.d --- a/parser/Parser.d Fri May 02 18:23:33 2008 +0200 +++ b/parser/Parser.d Fri May 02 19:51:58 2008 +0200 @@ -237,6 +237,11 @@ Decl func = action.actOnStartOfFunctionDef(type, name); parseFuncArgs(func); + if(lexer.peek.type == Tok.Seperator) + { + lexer.next; + return func; + } Stmt stmt = parseCompoundStatement(); return action.actOnEndOfFunction(func, stmt); @@ -254,7 +259,9 @@ while(lexer.peek.type != Tok.CloseParentheses) { auto t = parseType(); - auto i = parseIdentifier(); + Id i; + if(lexer.peek.type == Tok.Identifier) + i = parseIdentifier(); action.addFuncArg(func, t, i); if(lexer.peek.type == Tok.Comma) diff -r 110c7e1c4ca2 -r 06dda301ea61 sema/AstAction.d --- a/sema/AstAction.d Fri May 02 18:23:33 2008 +0200 +++ b/sema/AstAction.d Fri May 02 19:51:58 2008 +0200 @@ -63,7 +63,10 @@ override void addFuncArg(DeclT func, Id type, Id name) { FuncDecl fd = cast(FuncDecl)func; - fd.addParam(new Identifier(type.tok), new Identifier(name.tok)); + if(name) + fd.addParam(new Identifier(type.tok), new Identifier(name.tok)); + else + fd.addParam(new Identifier(type.tok)); } override DeclT actOnEndOfFunction(DeclT func, StmtT stmts) diff -r 110c7e1c4ca2 -r 06dda301ea61 sema/SymbolTable.d --- a/sema/SymbolTable.d Fri May 02 18:23:33 2008 +0200 +++ b/sema/SymbolTable.d Fri May 02 19:51:58 2008 +0200 @@ -32,6 +32,8 @@ Symbol find(Identifier id) { + if(!id) + return null; if (auto sym = id in symbols) return *sym; if (enclosing !is null) diff -r 110c7e1c4ca2 -r 06dda301ea61 sema/SymbolTableBuilder.d --- a/sema/SymbolTableBuilder.d Fri May 02 18:23:33 2008 +0200 +++ b/sema/SymbolTableBuilder.d Fri May 02 19:51:58 2008 +0200 @@ -34,11 +34,14 @@ override void visitVarDecl(VarDecl d) { + visitExp(d.varType); + if(!d.identifier) + return; + if (d.init) visitExp(d.init); d.env.find(d.identifier).type = typeOf(d.varType, d.env); - visitExp(d.varType); visitExp(d.identifier); } @@ -135,6 +138,8 @@ --need_push; } + if(!d.identifier) + return; auto sc = current(); auto sym = sc.add(d.identifier); d.env = sc; diff -r 110c7e1c4ca2 -r 06dda301ea61 sema/Visitor.d --- a/sema/Visitor.d Fri May 02 18:23:33 2008 +0200 +++ b/sema/Visitor.d Fri May 02 19:51:58 2008 +0200 @@ -95,7 +95,8 @@ DeclT visitVarDecl(VarDecl d) { visitExp(d.varType); - visitExp(d.identifier); + if(d.identifier) + visitExp(d.identifier); if (d.init) visitExp(d.init);