fix: pointer type names in let/cast/params (String*), cast uses actual target type

This commit is contained in:
2026-05-31 21:01:39 +03:00
parent 1495b24a9e
commit e2c1a21059
4 changed files with 56 additions and 6 deletions
+5 -1
View File
@@ -222,7 +222,11 @@ func CBE_EmitExpr(cbe: *CEmitter, node: *HirNode) {
// Cast // Cast
if kind == hCast { if kind == hCast {
StringBuilder_Append(&cbe.sb, "(("); 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, ")"); StringBuilder_Append(&cbe.sb, ")");
CBE_EmitExpr(cbe, node.child1); CBE_EmitExpr(cbe, node.child1);
StringBuilder_Append(&cbe.sb, ")"); StringBuilder_Append(&cbe.sb, ")");
+23 -2
View File
@@ -110,6 +110,15 @@ func Lcx_LowerExpr(ctx: *LowerCtx, expr: *Expr) -> *HirNode {
if kind == ekCast { if kind == ekCast {
n.kind = hCast; n.kind = hCast;
n.child1 = Lcx_LowerExpr(ctx, expr.child1); 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; return n;
} }
@@ -173,7 +182,12 @@ func Lcx_LowerStmt(ctx: *LowerCtx, stmt: *Stmt) -> *HirNode {
alloca.typeName = ""; alloca.typeName = "";
if stmt.refStmtType != null as *TypeExpr { if stmt.refStmtType != null as *TypeExpr {
alloca.intValue = stmt.refStmtType.kind; 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 // store the init value
n.kind = hStore; n.kind = hStore;
@@ -281,7 +295,14 @@ func Lcx_LowerParam(out: *HirParam, p: *Param) {
out.name = p.name; out.name = p.name;
if p.refParamType != null as *TypeExpr { if p.refParamType != null as *TypeExpr {
out.typeKind = p.refParamType.kind; 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 { } else {
out.typeKind = 0; out.typeKind = 0;
out.typeName = ""; out.typeName = "";
+5 -1
View File
@@ -222,7 +222,11 @@ func CBE_EmitExpr(cbe: *CEmitter, node: *HirNode) {
// Cast // Cast
if kind == hCast { if kind == hCast {
StringBuilder_Append(&cbe.sb, "(("); 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, ")"); StringBuilder_Append(&cbe.sb, ")");
CBE_EmitExpr(cbe, node.child1); CBE_EmitExpr(cbe, node.child1);
StringBuilder_Append(&cbe.sb, ")"); StringBuilder_Append(&cbe.sb, ")");
+23 -2
View File
@@ -110,6 +110,15 @@ func Lcx_LowerExpr(ctx: *LowerCtx, expr: *Expr) -> *HirNode {
if kind == ekCast { if kind == ekCast {
n.kind = hCast; n.kind = hCast;
n.child1 = Lcx_LowerExpr(ctx, expr.child1); 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; return n;
} }
@@ -173,7 +182,12 @@ func Lcx_LowerStmt(ctx: *LowerCtx, stmt: *Stmt) -> *HirNode {
alloca.typeName = ""; alloca.typeName = "";
if stmt.refStmtType != null as *TypeExpr { if stmt.refStmtType != null as *TypeExpr {
alloca.intValue = stmt.refStmtType.kind; 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 // store the init value
n.kind = hStore; n.kind = hStore;
@@ -281,7 +295,14 @@ func Lcx_LowerParam(out: *HirParam, p: *Param) {
out.name = p.name; out.name = p.name;
if p.refParamType != null as *TypeExpr { if p.refParamType != null as *TypeExpr {
out.typeKind = p.refParamType.kind; 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 { } else {
out.typeKind = 0; out.typeKind = 0;
out.typeName = ""; out.typeName = "";