Hi all,

Here's a relatively straightforward patch for #1633; we simply walk the
constructor's arguments and check that there's a matching field
definition for it.  If not, bail out with syntax-error.

Cheers,
Peter
From 7606cb342a09abb3f0c5798136811f65e736339b Mon Sep 17 00:00:00 2001
From: Peter Bex <pe...@more-magic.net>
Date: Sun, 6 Oct 2019 20:56:39 +0200
Subject: [PATCH] Check constructor args against field defs in
 define-record-type

It's okay to have field definitions which don't show up in the
constructor argument list (those will have an unspecified value
according to the SRFI), but if there are arguments which don't
correspond to any field (which SRFI-9 calls "<field tag>"), this is an
error.  We now actually signal an error to help the user spot typos.

This fixes #1633
---
 NEWS               | 2 ++
 chicken-syntax.scm | 8 ++++++++
 2 files changed, 10 insertions(+)

diff --git a/NEWS b/NEWS
index d2708547..64b8f6db 100644
--- a/NEWS
+++ b/NEWS
@@ -26,6 +26,8 @@
     C_i_check_exact_2 have been deprecated (see also #1631).
   - When garbage collector is manually invoked from a finalizer, raise
     an error instead of hanging forever (fixes #1586).
+  - define-record-type will now give an error if the constructor
+    definition refers to field that's not listed elsewhere (see #1633)
 
 - Compiler
   - Fixed a bug in lfa2 pass which caused "if" or "cond" nodes to be
diff --git a/chicken-syntax.scm b/chicken-syntax.scm
index e943222d..54609dac 100644
--- a/chicken-syntax.scm
+++ b/chicken-syntax.scm
@@ -1097,6 +1097,14 @@
 	   (x (r 'x))
 	   (y (r 'y))
 	   (slotnames (map car slots)))
+      ;; Check for inconsistencies in slot names vs constructor args
+      (for-each (lambda (vname)
+		  (unless (memq vname slotnames)
+		    (syntax-error
+		     'define-record-type
+		     "unknown slot name in constructor definition"
+		     vname)))
+		vars)
       `(##core#begin
 	;; TODO: Maybe wrap this in an opaque object?
 	(,%define ,type-name (##core#quote ,tag))
-- 
2.20.1

Attachment: signature.asc
Description: PGP signature

_______________________________________________
Chicken-hackers mailing list
Chicken-hackers@nongnu.org
https://lists.nongnu.org/mailman/listinfo/chicken-hackers

Reply via email to