aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ast.c
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-07 19:06:29 +0900
committernsfisis <nsfisis@gmail.com>2026-02-07 19:06:38 +0900
commit0ae64ed2c00f66c7f3ddec8689169bacafff87ea (patch)
treec72db385bca5de58910f2769168a7b0918309c21 /src/ast.c
parent7ba8a506a215846d14d71487807f5e525e9e5c16 (diff)
downloadducc-0ae64ed2c00f66c7f3ddec8689169bacafff87ea.tar.gz
ducc-0ae64ed2c00f66c7f3ddec8689169bacafff87ea.tar.zst
ducc-0ae64ed2c00f66c7f3ddec8689169bacafff87ea.zip
feat: partially support float/double
Diffstat (limited to 'src/ast.c')
-rw-r--r--src/ast.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/ast.c b/src/ast.c
index eb478c5..89c8aea 100644
--- a/src/ast.c
+++ b/src/ast.c
@@ -130,10 +130,10 @@ int type_sizeof(Type* ty) {
return 1;
else if (ty->kind == TypeKind_short || ty->kind == TypeKind_ushort)
return 2;
- else if (ty->kind == TypeKind_int || ty->kind == TypeKind_uint)
+ else if (ty->kind == TypeKind_int || ty->kind == TypeKind_uint || ty->kind == TypeKind_float)
return 4;
else if (ty->kind == TypeKind_long || ty->kind == TypeKind_ulong || ty->kind == TypeKind_llong ||
- ty->kind == TypeKind_ullong)
+ ty->kind == TypeKind_ullong || ty->kind == TypeKind_double)
return 8;
else if (ty->kind == TypeKind_struct)
return type_sizeof_struct(ty);
@@ -161,10 +161,10 @@ int type_alignof(Type* ty) {
return 1;
else if (ty->kind == TypeKind_short || ty->kind == TypeKind_ushort)
return 2;
- else if (ty->kind == TypeKind_int || ty->kind == TypeKind_uint)
+ else if (ty->kind == TypeKind_int || ty->kind == TypeKind_uint || ty->kind == TypeKind_float)
return 4;
else if (ty->kind == TypeKind_long || ty->kind == TypeKind_ulong || ty->kind == TypeKind_llong ||
- ty->kind == TypeKind_ullong)
+ ty->kind == TypeKind_ullong || ty->kind == TypeKind_double)
return 8;
else if (ty->kind == TypeKind_struct)
return type_alignof_struct(ty);
@@ -240,6 +240,8 @@ const char* astnode_kind_stringify(AstNodeKind k) {
return "if_stmt";
case AstNodeKind_int_expr:
return "int_expr";
+ case AstNodeKind_double_expr:
+ return "double_expr";
case AstNodeKind_label_stmt:
return "label_stmt";
case AstNodeKind_list:
@@ -325,6 +327,14 @@ AstNode* ast_new_int(int v) {
return e;
}
+AstNode* ast_new_double(double v) {
+ AstNode* e = ast_new(AstNodeKind_double_expr);
+ e->as.double_expr = calloc(1, sizeof(DoubleExprNode));
+ e->as.double_expr->value = v;
+ e->ty = type_new(TypeKind_double);
+ return e;
+}
+
AstNode* ast_new_unary_expr(int op, AstNode* operand) {
AstNode* e = ast_new(AstNodeKind_unary_expr);
e->as.unary_expr = calloc(1, sizeof(UnaryExprNode));