aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/structs.c
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-15 00:04:23 +0900
committernsfisis <nsfisis@gmail.com>2026-02-15 00:04:23 +0900
commit2009a26e17ad9dbefee3a5ca4339d754e51ef078 (patch)
tree5c311a1a17f40786f53f4a89c5bbbb72402a6b2d /tests/structs.c
parentef0cb4dbdc1c036f70f94a905cbacae9be5abf5e (diff)
downloadducc-2009a26e17ad9dbefee3a5ca4339d754e51ef078.tar.gz
ducc-2009a26e17ad9dbefee3a5ca4339d754e51ef078.tar.zst
ducc-2009a26e17ad9dbefee3a5ca4339d754e51ef078.zip
refactor: write more tests in C
Diffstat (limited to 'tests/structs.c')
-rw-r--r--tests/structs.c241
1 files changed, 241 insertions, 0 deletions
diff --git a/tests/structs.c b/tests/structs.c
new file mode 100644
index 0000000..734d501
--- /dev/null
+++ b/tests/structs.c
@@ -0,0 +1,241 @@
+#include <helpers.h>
+
+void* calloc(long, long);
+
+struct Token {
+ int kind;
+ char* value;
+};
+
+struct Define {
+ char* from;
+ struct Token* to;
+};
+
+struct AstNode0;
+
+struct Type0 {
+ int kind;
+ struct Type0* to;
+ struct AstNode0* members;
+};
+
+struct AstNode0 {
+ int kind;
+ struct AstNode0* next;
+ struct AstNode0* last;
+ char* name;
+ struct AstNode0* func_params;
+ struct AstNode0* func_body;
+ int int_value;
+ struct AstNode0* expr1;
+ struct AstNode0* expr2;
+ struct AstNode0* expr3;
+ int op;
+ struct Type0* ty;
+ int var_index;
+ struct AstNode0* node1;
+ struct AstNode0* node2;
+ char** str_literals;
+};
+
+struct LVar {
+ char* name;
+ struct Type0* ty;
+};
+
+struct Func0 {
+ char* name;
+ struct Type0* ty;
+};
+
+struct Parser {
+ struct Token* tokens;
+ int pos;
+ struct LVar* locals;
+ int n_locals;
+ struct Func0* funcs;
+ int n_funcs;
+ char** str_literals;
+ int n_str_literals;
+};
+
+struct CodeGen {
+ int next_label;
+ int* loop_labels;
+};
+
+struct S1 {
+ int a;
+ int b;
+};
+
+struct T1;
+
+struct S2 {
+ struct T1* a;
+};
+
+struct T1 {
+ int b;
+};
+
+struct S3 {
+ int a, b;
+};
+
+struct T3 {
+ short *a, b, c[12];
+};
+
+struct S4 {
+ int a[5];
+};
+
+struct S5 {
+ int a;
+ int b;
+};
+
+struct S6 {
+ long a;
+ long b;
+};
+typedef struct S6 S6;
+
+struct S7 {
+ int x;
+};
+typedef struct S7 S7;
+
+struct S8_fwd;
+typedef struct S8_fwd S8_fwd;
+
+struct S9 {
+ int x;
+};
+
+struct S10 {
+ int x;
+};
+
+struct S11 {
+ int x;
+};
+
+struct S12 {
+ int x;
+};
+
+struct S8_fwd {
+ int x;
+};
+
+typedef struct {
+ int x;
+ int y;
+} AnonS;
+
+typedef union {
+ int a;
+ char b;
+} AnonU;
+
+typedef enum {
+ RED,
+ GREEN,
+ BLUE
+} AnonE;
+
+struct S_nested {
+ struct {
+ int x;
+ int y;
+ };
+ struct {
+ int z;
+ };
+};
+
+int main() {
+ struct S1* sp;
+ sp = calloc(1, sizeof(struct S1));
+ sp->a = 42;
+ ASSERT_EQ(42, sp->a);
+ (*sp).b = 123;
+ ASSERT_EQ(123, (*sp).b);
+
+ struct S2* s2 = calloc(1, sizeof(struct S2));
+ s2->a = calloc(1, sizeof(struct T1));
+ s2->a->b = 42;
+ ASSERT_EQ(42, s2->a->b);
+
+ ASSERT_EQ(8, sizeof(struct S3));
+ ASSERT_EQ(40, sizeof(struct T3));
+
+ struct S4 x;
+ x.a[0] = 10;
+ x.a[1] = 20;
+ x.a[2] = 30;
+ x.a[3] = 40;
+ x.a[4] = 50;
+ ASSERT_EQ(20, sizeof(struct S4));
+ ASSERT_EQ(10, x.a[0]);
+ ASSERT_EQ(20, x.a[1]);
+ ASSERT_EQ(30, x.a[2]);
+ ASSERT_EQ(40, x.a[3]);
+ ASSERT_EQ(50, x.a[4]);
+
+ struct S5* s5 = calloc(1, sizeof(struct S5));
+ s5->b = 1;
+ ASSERT_EQ(0, s5->a);
+ ASSERT_EQ(1, s5->b);
+
+ struct S1* sc1 = calloc(1, sizeof(struct S1));
+ struct S1* sc2 = calloc(1, sizeof(struct S1));
+ sc1->a = 123;
+ sc1->b = 456;
+ ASSERT_EQ(123, sc1->a);
+ ASSERT_EQ(456, sc1->b);
+ ASSERT_EQ(0, sc2->a);
+ ASSERT_EQ(0, sc2->b);
+ *sc2 = *sc1;
+ ASSERT_EQ(123, sc2->a);
+ ASSERT_EQ(456, sc2->b);
+
+ S6* sl1 = calloc(1, sizeof(S6));
+ S6* sl2 = calloc(1, sizeof(S6));
+ sl1->a = 123;
+ sl1->b = 456;
+ ASSERT_EQ(123, sl1->a);
+ ASSERT_EQ(456, sl1->b);
+ ASSERT_EQ(0, sl2->a);
+ ASSERT_EQ(0, sl2->b);
+ *sl2 = *sl1;
+ ASSERT_EQ(123, sl2->a);
+ ASSERT_EQ(456, sl2->b);
+
+ S6 sv1;
+ S6 sv2;
+ sv1.a = 123;
+ sv1.b = 456;
+ sv2.a = 0;
+ sv2.b = 0;
+ ASSERT_EQ(123, sv1.a);
+ ASSERT_EQ(456, sv1.b);
+ ASSERT_EQ(0, sv2.a);
+ ASSERT_EQ(0, sv2.b);
+ sv2 = sv1;
+ ASSERT_EQ(123, sv2.a);
+ ASSERT_EQ(456, sv2.b);
+
+ S7* s7 = calloc(1, sizeof(S7));
+ s7->x = 42;
+ ASSERT_EQ(42, s7->x);
+
+ ASSERT_EQ(4, sizeof(S8_fwd));
+
+ ASSERT_EQ(8, sizeof(AnonS));
+ ASSERT_EQ(4, sizeof(AnonU));
+ ASSERT_EQ(4, sizeof(AnonE));
+}