about summary refs log tree commit diff
path: root/boot/ir.c
diff options
context:
space:
mode:
authorMel <mel@rnrd.eu>2026-05-24 20:14:29 +0200
committerMel <mel@rnrd.eu>2026-05-24 20:14:29 +0200
commit2a893246711442dd8407264c05991b44d1d1f66f (patch)
treea0d4a621994ebb259331b7082a977e4ae2861bde /boot/ir.c
parentf028bc7ef3101facfa004c21f3aa5feb3dc6f107 (diff)
downloadcatskill-2a893246711442dd8407264c05991b44d1d1f66f.tar.zst
catskill-2a893246711442dd8407264c05991b44d1d1f66f.zip
Emit IR/C increment/decrement in expression position
Signed-off-by: Mel <mel@rnrd.eu>
Diffstat (limited to 'boot/ir.c')
-rw-r--r--boot/ir.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/boot/ir.c b/boot/ir.c
index d8d8aa2..16811ed 100644
--- a/boot/ir.c
+++ b/boot/ir.c
@@ -248,6 +248,7 @@ enum Expression_Kind
     EXPRESSION_SUBSCRIPT,
     EXPRESSION_CAST,
     EXPRESSION_CONSTRUCT,
+    EXPRESSION_INCREMENT_DECREMENT,
 };
 
 struct Expression_Integer_Literal
@@ -343,6 +344,13 @@ struct Expression_Construct
     Array(struct Construct_Field) fields;
 };
 
+struct Expression_Increment_Decrement
+{
+    bool prefix;
+    enum Increment_Decrement_Operation operation;
+    struct Expression* subject;
+};
+
 union Expression_Value
 {
     struct Expression_Integer_Literal integer_literal;
@@ -358,6 +366,7 @@ union Expression_Value
     struct Expression_Subscript subscript;
     struct Expression_Cast cast;
     struct Expression_Construct construct;
+    struct Expression_Increment_Decrement increment_decrement;
 };
 
 struct Expression
@@ -682,6 +691,18 @@ ir_make_construct(Type_Id type_id, Array(struct Construct_Field) fields, struct
     return expression_new(EXPRESSION_CONSTRUCT, v, span);
 }
 
+struct Expression*
+ir_make_increment_decrement(
+    struct Expression* subject, enum Increment_Decrement_Operation op, bool prefix,
+    struct Span span)
+{
+    union Expression_Value v = { 0 };
+    v.increment_decrement.subject = subject;
+    v.increment_decrement.operation = op;
+    v.increment_decrement.prefix = prefix;
+    return expression_new(EXPRESSION_INCREMENT_DECREMENT, v, span);
+}
+
 struct Type_Ref
 type_ref_bare(Type_Id type_id)
 {