# HG changeset patch # User Anders Halager # Date 1209752330 -7200 # Node ID 9375bd975730a66745c5fdb5a465e4b1517b5059 # Parent cc05c041e6a349ffaf4bdf450536b2107ae736e2 Allow indexing of pointers also diff -r cc05c041e6a3 -r 9375bd975730 ast/Exp.d --- a/ast/Exp.d Fri May 02 20:17:22 2008 +0200 +++ b/ast/Exp.d Fri May 02 20:18:50 2008 +0200 @@ -317,9 +317,12 @@ override DType type() { - assert(target.type().isArray(), "Can only index arrays"); - DArray array = target.type().asArray(); - return array.arrayOf; + DType type = target.type(); + if (type.isArray()) + return type.asArray().arrayOf; + else if (type.isPointer()) + return type.asPointer().pointerOf; + else assert(0, "Can only index pointers and arrays"); } Exp simplify() diff -r cc05c041e6a3 -r 9375bd975730 gen/CodeGen.d --- a/gen/CodeGen.d Fri May 02 20:17:22 2008 +0200 +++ b/gen/CodeGen.d Fri May 02 20:18:50 2008 +0200 @@ -503,12 +503,22 @@ return b.buildLoad(target, "deref"); case ExpType.Index: auto indexExp = cast(IndexExp)exp; - auto array = getPointer(indexExp.target); + auto type = indexExp.target.type; auto index = genExpression(indexExp.index); Value[2] gep_indices; gep_indices[0] = ConstantInt.Get(IntegerType.Int32, 0, false); gep_indices[1] = index; - return b.buildGEP(array, gep_indices[], "index"); + if (type.isArray()) + { + auto array = getPointer(indexExp.target); + return b.buildGEP(array, gep_indices[0 .. 2], "index"); + } + else if (type.isPointer()) + { + auto array = genExpression(indexExp.target); + return b.buildGEP(array, gep_indices[1 .. 2], "index"); + } + else assert(0, "Can only index pointers and arrays"); case ExpType.MemberReference: auto mem = cast(MemberReference)exp; Stdout(mem.target).newline;