Opened 5 years ago

Last modified 4 months ago

#231 assigned defect

DEFSTRUCT accessor functions overwrite accessors in :INCLUDEd structs

Reported by: ehuelsmann Owned by: not-assigned
Priority: major Milestone: 1.6.0
Component: libraries Version: 1.2.0-dev
Keywords: Cc:
Parent Tickets:

Description

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.

Subtickets (add)

Change History (10)

comment:1 Changed 5 years ago 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!

comment:2 Changed 5 years ago by ehuelsmann

  • Milestone changed from 1.1.0 to 1.2.0

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.

comment:3 Changed 5 years ago by mevenson

  • Version set to 1.2.0-dev

comment:4 Changed 4 years ago by https://www.google.com/accounts/o8/id?id=AItOawkYnNNEAO_K40Gp0xROhyjOPgjvIskQ48M

  • Milestone changed from 1.2.0 to 1.3.0

comment:5 Changed 4 years ago by mevenson

  • Owner changed from mevenson to not-assigned
  • Status changed from new to assigned

comment:6 Changed 4 years ago by mevenson

  • Milestone changed from 1.3.0 to 2.0

Ticket retargeted after milestone closed

comment:7 Changed 4 years ago by mevenson

  • Milestone changed from 2.0 to 2.0.0

Milestone renamed

comment:8 Changed 4 years ago by mevenson

  • Milestone changed from 2.0.0 to 1.4.0

comment:9 Changed 13 months ago by mevenson

  • Milestone changed from 1.4.0 to 1.5.0

Ticket retargeted after milestone closed

comment:10 Changed 4 months ago by mevenson

  • Milestone changed from 1.5.0 to 1.6.0

Ticket retargeted after milestone closed

Note: See TracTickets for help on using tickets.