separate tags and typedefs
C has two namespaces and the database had one. A typedef of a tag's name wiped it. Tags, i.e. struct, enum and union, share one namespace; they move to a table of their own. A name resolves the way C does: the ordinary identifier first, the tag when that leads nowhere. While resolving a typedef, the target was taken apart with cadr whatever it was, so (typedef points (¤ point 4)) reported point's fields as its own -- an array of four points claiming to be a point, and a macro reaching through it with v->x. Only a name and (struct|union|enum NAME) name a type now.
This commit is contained in:
@@ -79,6 +79,38 @@
|
||||
#f
|
||||
(get-fields 't-u8))
|
||||
|
||||
;; C keeps typedefs and ordinary identifiers apart, and the canonical way
|
||||
;; to declare a struct uses both names at once. Neither declaration
|
||||
;; may stand on the other.
|
||||
(add-struct 't-node '(struct t-node ((next (* t-node)) (v int))))
|
||||
(add-typedef 't-node '(typedef t-node (struct t-node)))
|
||||
(test "a typedef of a struct's own name keeps the struct reachable"
|
||||
'((next (* t-node)) (v int))
|
||||
(get-fields 't-node))
|
||||
(test "and the tag is there under its own name"
|
||||
'(struct t-node ((next (* t-node)) (v int)))
|
||||
(get-tag-info 't-node))
|
||||
(add-struct 't-rect '(struct t-rect ((w int) (h int))))
|
||||
(add-define 't-rect '(define t-rect 3))
|
||||
(test "a define of a tag's name does not hide the fields"
|
||||
'((w int) (h int))
|
||||
(get-fields 't-rect))
|
||||
|
||||
;; A type built over a struct is not that struct. Handing back the
|
||||
;; element's fields would have a macro write v->x for an array
|
||||
(add-typedef 't-points '(typedef t-points (¤ t-point 4)))
|
||||
(test "an array of a struct has no fields of its own"
|
||||
#f
|
||||
(get-fields 't-points))
|
||||
(add-typedef 't-point-p '(typedef t-point-p (* t-point)))
|
||||
(test "nor does a pointer to one"
|
||||
#f
|
||||
(get-fields 't-point-p))
|
||||
(add-typedef 't-cb '(typedef t-cb (fn ((t-point)) void)))
|
||||
(test "nor a function type over one"
|
||||
#f
|
||||
(get-fields 't-cb))
|
||||
|
||||
;; A typedef can be written to lead back to itself. Resolving it must
|
||||
;; stop rather than spin
|
||||
(add-typedef 't-loop-a '(typedef t-loop-a t-loop-b))
|
||||
|
||||
Reference in New Issue
Block a user