From 5af2e99f5f178a58d4a3d5b89abb2198ed23bf33 Mon Sep 17 00:00:00 2001 From: alex-eg Date: Mon, 14 Sep 2026 18:16:14 +0300 Subject: [PATCH] reject nested pointer types with proper error message --- fmt-c-writer.scm | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/fmt-c-writer.scm b/fmt-c-writer.scm index 02b13ec..a896022 100644 --- a/fmt-c-writer.scm +++ b/fmt-c-writer.scm @@ -291,11 +291,26 @@ forms, and what remains." (else (type-convert-to-c form)))) +(define (has-pointer-star? form) + (and (pair? form) + (or (memq '* form) + (any has-pointer-star? (filter pair? form))))) + +;;; A `*' inside a sublist. Pointer chains are written flat -- (* * T), +;;; never (* (* T)) +;;; Sublists that merely group, like (* (const struct suc)), contain +;;; no `*' and are fine. +(define (nested-pointer? type) + (and (pair? type) + (any has-pointer-star? (filter pair? type)))) + (define (type-convert-to-c type) ;; Our pointers to C pointers ;; int -> int ;; * const char -> const char * ;; const * const char -> const char * const + (when (nested-pointer? type) + (sex-error type "pointer chains are written flat, as (* * T), not nested" type)) (if (atom? type) (atom-to-fmt-c type) (flatten (tree-map atom-to-fmt-c