diff --git a/_selfhost/src/c_backend.bux b/_selfhost/src/c_backend.bux index dbecf30..8452743 100644 --- a/_selfhost/src/c_backend.bux +++ b/_selfhost/src/c_backend.bux @@ -222,7 +222,11 @@ func CBE_EmitExpr(cbe: *CEmitter, node: *HirNode) { // Cast if kind == hCast { StringBuilder_Append(&cbe.sb, "(("); - StringBuilder_Append(&cbe.sb, CBackend_TypeToC(tyPointer)); + if !String_Eq(node.typeName, "") { + StringBuilder_Append(&cbe.sb, node.typeName); + } else { + StringBuilder_Append(&cbe.sb, CBackend_TypeToC(node.typeKind)); + } StringBuilder_Append(&cbe.sb, ")"); CBE_EmitExpr(cbe, node.child1); StringBuilder_Append(&cbe.sb, ")"); diff --git a/_selfhost/src/hir_lower.bux b/_selfhost/src/hir_lower.bux index 71a9533..20fbd16 100644 --- a/_selfhost/src/hir_lower.bux +++ b/_selfhost/src/hir_lower.bux @@ -110,6 +110,15 @@ func Lcx_LowerExpr(ctx: *LowerCtx, expr: *Expr) -> *HirNode { if kind == ekCast { n.kind = hCast; n.child1 = Lcx_LowerExpr(ctx, expr.child1); + if expr.refType != null as *TypeExpr { + n.typeKind = expr.refType.kind; + // For pointer types, construct "PointeeType*" + if expr.refType.kind == tekPointer && expr.refType.pointerPointee != null as *TypeExpr { + n.typeName = String_Concat(expr.refType.pointerPointee.typeName, "*"); + } else if !String_Eq(expr.refType.typeName, "") { + n.typeName = expr.refType.typeName; + } + } return n; } @@ -173,7 +182,12 @@ func Lcx_LowerStmt(ctx: *LowerCtx, stmt: *Stmt) -> *HirNode { alloca.typeName = ""; if stmt.refStmtType != null as *TypeExpr { alloca.intValue = stmt.refStmtType.kind; - alloca.typeName = stmt.refStmtType.typeName; + // For pointer types, construct "PointeeType*" + if stmt.refStmtType.kind == tekPointer && stmt.refStmtType.pointerPointee != null as *TypeExpr { + alloca.typeName = String_Concat(stmt.refStmtType.pointerPointee.typeName, "*"); + } else if !String_Eq(stmt.refStmtType.typeName, "") { + alloca.typeName = stmt.refStmtType.typeName; + } } // store the init value n.kind = hStore; @@ -281,7 +295,14 @@ func Lcx_LowerParam(out: *HirParam, p: *Param) { out.name = p.name; if p.refParamType != null as *TypeExpr { out.typeKind = p.refParamType.kind; - out.typeName = p.refParamType.typeName; + // For pointer types, construct "PointeeType*" + if p.refParamType.kind == tekPointer && p.refParamType.pointerPointee != null as *TypeExpr { + out.typeName = String_Concat(p.refParamType.pointerPointee.typeName, "*"); + } else if !String_Eq(p.refParamType.typeName, "") { + out.typeName = p.refParamType.typeName; + } else { + out.typeName = ""; + } } else { out.typeKind = 0; out.typeName = ""; diff --git a/src_bux/c_backend.bux b/src_bux/c_backend.bux index dbecf30..8452743 100644 --- a/src_bux/c_backend.bux +++ b/src_bux/c_backend.bux @@ -222,7 +222,11 @@ func CBE_EmitExpr(cbe: *CEmitter, node: *HirNode) { // Cast if kind == hCast { StringBuilder_Append(&cbe.sb, "(("); - StringBuilder_Append(&cbe.sb, CBackend_TypeToC(tyPointer)); + if !String_Eq(node.typeName, "") { + StringBuilder_Append(&cbe.sb, node.typeName); + } else { + StringBuilder_Append(&cbe.sb, CBackend_TypeToC(node.typeKind)); + } StringBuilder_Append(&cbe.sb, ")"); CBE_EmitExpr(cbe, node.child1); StringBuilder_Append(&cbe.sb, ")"); diff --git a/src_bux/hir_lower.bux b/src_bux/hir_lower.bux index 71a9533..20fbd16 100644 --- a/src_bux/hir_lower.bux +++ b/src_bux/hir_lower.bux @@ -110,6 +110,15 @@ func Lcx_LowerExpr(ctx: *LowerCtx, expr: *Expr) -> *HirNode { if kind == ekCast { n.kind = hCast; n.child1 = Lcx_LowerExpr(ctx, expr.child1); + if expr.refType != null as *TypeExpr { + n.typeKind = expr.refType.kind; + // For pointer types, construct "PointeeType*" + if expr.refType.kind == tekPointer && expr.refType.pointerPointee != null as *TypeExpr { + n.typeName = String_Concat(expr.refType.pointerPointee.typeName, "*"); + } else if !String_Eq(expr.refType.typeName, "") { + n.typeName = expr.refType.typeName; + } + } return n; } @@ -173,7 +182,12 @@ func Lcx_LowerStmt(ctx: *LowerCtx, stmt: *Stmt) -> *HirNode { alloca.typeName = ""; if stmt.refStmtType != null as *TypeExpr { alloca.intValue = stmt.refStmtType.kind; - alloca.typeName = stmt.refStmtType.typeName; + // For pointer types, construct "PointeeType*" + if stmt.refStmtType.kind == tekPointer && stmt.refStmtType.pointerPointee != null as *TypeExpr { + alloca.typeName = String_Concat(stmt.refStmtType.pointerPointee.typeName, "*"); + } else if !String_Eq(stmt.refStmtType.typeName, "") { + alloca.typeName = stmt.refStmtType.typeName; + } } // store the init value n.kind = hStore; @@ -281,7 +295,14 @@ func Lcx_LowerParam(out: *HirParam, p: *Param) { out.name = p.name; if p.refParamType != null as *TypeExpr { out.typeKind = p.refParamType.kind; - out.typeName = p.refParamType.typeName; + // For pointer types, construct "PointeeType*" + if p.refParamType.kind == tekPointer && p.refParamType.pointerPointee != null as *TypeExpr { + out.typeName = String_Concat(p.refParamType.pointerPointee.typeName, "*"); + } else if !String_Eq(p.refParamType.typeName, "") { + out.typeName = p.refParamType.typeName; + } else { + out.typeName = ""; + } } else { out.typeKind = 0; out.typeName = "";