fix: pointer type names in let/cast/params (String*), cast uses actual target type
This commit is contained in:
@@ -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, ")");
|
||||||
|
|||||||
@@ -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,8 +182,13 @@ 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;
|
||||||
|
// 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;
|
alloca.typeName = stmt.refStmtType.typeName;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// store the init value
|
// store the init value
|
||||||
n.kind = hStore;
|
n.kind = hStore;
|
||||||
n.child1 = alloca;
|
n.child1 = alloca;
|
||||||
@@ -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;
|
||||||
|
// 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;
|
out.typeName = p.refParamType.typeName;
|
||||||
|
} else {
|
||||||
|
out.typeName = "";
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
out.typeKind = 0;
|
out.typeKind = 0;
|
||||||
out.typeName = "";
|
out.typeName = "";
|
||||||
|
|||||||
@@ -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, ")");
|
||||||
|
|||||||
@@ -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,8 +182,13 @@ 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;
|
||||||
|
// 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;
|
alloca.typeName = stmt.refStmtType.typeName;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// store the init value
|
// store the init value
|
||||||
n.kind = hStore;
|
n.kind = hStore;
|
||||||
n.child1 = alloca;
|
n.child1 = alloca;
|
||||||
@@ -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;
|
||||||
|
// 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;
|
out.typeName = p.refParamType.typeName;
|
||||||
|
} else {
|
||||||
|
out.typeName = "";
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
out.typeKind = 0;
|
out.typeKind = 0;
|
||||||
out.typeName = "";
|
out.typeName = "";
|
||||||
|
|||||||
Reference in New Issue
Block a user