#231: DEFSTRUCT accessor functions overwrite accessors in :INCLUDEd structs ------------------------+--------------------------------------------------- Reporter: ehuelsmann | Owner: mevenson Type: defect | Status: new Priority: major | Milestone: 1.1.0 Component: libraries | Version: Keywords: | ------------------------+--------------------------------------------------- Ralf Moeller reports:
The following file causes a problem in ABCL (1.1.0-dev-svn-14041) when compiled (!) and loaded.
(in-package cl-user)
(defstruct a (s1 nil))
(defstruct (b (:include a) (:conc-name foo-)) (s2 nil))
(defstruct (c (:include a) (:conc-name foo-)) (s3 nil))
(defun test () (let ((x (make-b :s1 1 :s2 2))) (foo-s1 x)))
CL-USER(4): (test) #<THREAD "interpreter" {2EF7D41F}>: Debugger invoked on condition of type SIMPLE-TYPE-ERROR The value #<B {564434F7}> is not of type C. Restarts: 0: TOP-LEVEL Return to top level. [1] CL-USER(6): (lisp-implementation-version) "1.1.0-dev-svn-14041" [1] CL-USER(7):
The problem is that the defstruct declaration for c "overwrites" the accessor foo-s1 generated by defstruct b. If foo-s1 is called for a b instance, the type assertions introduced by define-reader (and define-writer, see the ABCL implementation for defstruct) cause the error described above.
#231: DEFSTRUCT accessor functions overwrite accessors in :INCLUDEd structs ------------------------+--------------------------------------------------- Reporter: ehuelsmann | Owner: mevenson Type: defect | Status: new Priority: major | Milestone: 1.1.0 Component: libraries | Version: Keywords: | ------------------------+---------------------------------------------------
Comment(by ehuelsmann):
My response to Ralf was:
Thanks for the report. I've been thinking about it and I think the best solution is even easier to code: when an included DEFSTRUCT already defines the same accessor, we should simply not define it again: the result will be that the accessor checks for structs of type 'A and all of its subtypes will be allowed.
I'll log a ticket to that extent and try to come up with the right change to defstruct.lisp. However, if you can submit a patch to that extent, that'd be most appreciated!
#231: DEFSTRUCT accessor functions overwrite accessors in :INCLUDEd structs ------------------------+--------------------------------------------------- Reporter: ehuelsmann | Owner: mevenson Type: defect | Status: new Priority: major | Milestone: 1.2.0 Component: libraries | Version: Keywords: | ------------------------+--------------------------------------------------- Changes (by ehuelsmann):
* milestone: 1.1.0 => 1.2.0
Comment:
clisp exhibits the same behaviour and the spec allows it (or at least, doesn't specify behaviour for it).
Pushing out to 1.2.0 - not a blocker for 1.1.0.
#231: DEFSTRUCT accessor functions overwrite accessors in :INCLUDEd structs ------------------------+--------------------------------------------------- Reporter: ehuelsmann | Owner: mevenson Type: defect | Status: new Priority: major | Milestone: 1.2.0 Component: libraries | Version: 1.2.0-dev Keywords: | ------------------------+--------------------------------------------------- Changes (by mevenson):
* version: => 1.2.0-dev
armedbear-ticket@common-lisp.net