summaryrefslogtreecommitdiff
path: root/tests/features
diff options
context:
space:
mode:
Diffstat (limited to 'tests/features')
-rw-r--r--tests/features/test_asm_clobber.zc20
-rw-r--r--tests/features/test_portable_types.zc46
2 files changed, 66 insertions, 0 deletions
diff --git a/tests/features/test_asm_clobber.zc b/tests/features/test_asm_clobber.zc
new file mode 100644
index 0000000..2ba74da
--- /dev/null
+++ b/tests/features/test_asm_clobber.zc
@@ -0,0 +1,20 @@
+fn add(a: int, b: int) -> int {
+ let result: int;
+ asm {
+ "mov {a}, {result}"
+ "add {b}, {result}"
+ : out(result)
+ : in(a), in(b)
+ : clobber("cc")
+ }
+ return result;
+}
+
+test "asm_clobber" {
+ let res = add(10, 20);
+ if (res != 30) {
+ println "Failed: Expected 30, got {res}";
+ exit(1);
+ }
+ println "Success: asm with clobber works properly";
+}
diff --git a/tests/features/test_portable_types.zc b/tests/features/test_portable_types.zc
new file mode 100644
index 0000000..8f54fcb
--- /dev/null
+++ b/tests/features/test_portable_types.zc
@@ -0,0 +1,46 @@
+
+import "std/io.zc";
+
+// This test verifies the new portable integer types and C interop types.
+
+extern fn abs(x: c_int) -> c_int;
+extern fn labs(x: c_long) -> c_long;
+
+fn main() -> int {
+ // Portable types
+ let a: i32 = -42;
+ let b: u32 = 42;
+ let c: i64 = -1000000;
+ let d: u64 = 1000000;
+
+ if (a != -42) return 1;
+ if (b != 42) return 2;
+ if (c != -1000000) return 3;
+ if (d != 1000000) return 4;
+
+ // C Types
+ let ca: c_int = -10;
+ let cb: c_long = -20;
+ let cc: c_short = -5;
+ let cd: c_char = 65; // 'A'
+
+ // Test C interaction
+ let abs_val = abs(ca);
+ let expected_abs: c_int = 10;
+ if (abs_val != expected_abs) return 5;
+
+ let labs_val = labs(cb);
+ let expected_labs: c_long = 20;
+ if (labs_val != expected_labs) return 6;
+
+ // Size checks (these are platform dependent but we can check relations)
+ // sizeof(c_char) is always 1
+ if (sizeof(c_char) != 1) return 7;
+
+ // sizeof(c_short) <= sizeof(c_int) <= sizeof(c_long)
+ if (sizeof(c_short) > sizeof(c_int)) return 8;
+ if (sizeof(c_int) > sizeof(c_long)) return 9;
+
+ printf("Portable types test passed.\n");
+ return 0;
+}