aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-07-21 20:48:01 +0900
committernsfisis <nsfisis@gmail.com>2025-08-15 10:04:32 +0900
commit0c9dc7318361c93e837c8f4bc5c29869076c36cd (patch)
treea0998f947324fb42885338d0bd729d02d4309f40 /tests
parent1c48d0fe728c263bbe946a5d3adebaa29323ddff (diff)
downloadducc-0c9dc7318361c93e837c8f4bc5c29869076c36cd.tar.gz
ducc-0c9dc7318361c93e837c8f4bc5c29869076c36cd.tar.zst
ducc-0c9dc7318361c93e837c8f4bc5c29869076c36cd.zip
feat: implement va_*() functions
Diffstat (limited to 'tests')
-rw-r--r--tests/063.sh52
1 files changed, 52 insertions, 0 deletions
diff --git a/tests/063.sh b/tests/063.sh
new file mode 100644
index 0000000..f5f9505
--- /dev/null
+++ b/tests/063.sh
@@ -0,0 +1,52 @@
+set -e
+
+cat <<'EOF' > expected
+123
+456 789
+EOF
+
+bash ../../test_diff.sh <<'EOF'
+int fprintf();
+
+// System V Application Binary Interface
+// AMD64 Architecture Processor Supplement
+// (With LP64 and ILP32 Programming Models)
+// Version 1.0
+// Figure 3.34: va_list Type Declaration
+struct __va_list__ {
+ // unsigned int gp_offset;
+ // unsigned int fp_offset;
+ int gp_offset;
+ int fp_offset;
+ void* overflow_arg_area;
+ void* reg_save_area;
+};
+// ducc currently does not support array type.
+// typedef struct __va_list__ va_list[1];
+typedef struct __va_list__* va_list;
+
+// va_start() is currently implemented as a special form due to the limitation of #define macro.
+void va_end(va_list args) {
+}
+
+struct FILE;
+typedef struct FILE FILE;
+
+extern FILE* stdout;
+
+int vfprintf(FILE*, const char*, va_list);
+
+void fatal_error(const char* msg, ...) {
+ va_list args;
+ va_start(args, msg);
+ vfprintf(stdout, msg, args);
+ va_end(args);
+ fprintf(stdout, "\n");
+}
+
+int main() {
+ fatal_error("%d", 123);
+ fatal_error("%d %d", 456, 789);
+ return 0;
+}
+EOF