diff --git a/basis/alien/structs/structs.factor b/basis/alien/structs/structs.factor index 3d9cae1202..85b55f2cbc 100755 --- a/basis/alien/structs/structs.factor +++ b/basis/alien/structs/structs.factor @@ -65,3 +65,6 @@ M: struct-type stack-size : offset-of ( field struct -- offset ) c-types get at fields>> [ name>> = ] with find nip offset>> ; + +USE: vocabs.loader +"struct-arrays" require diff --git a/basis/classes/struct/struct-tests.factor b/basis/classes/struct/struct-tests.factor index f19d71974f..64b8ba83e2 100644 --- a/basis/classes/struct/struct-tests.factor +++ b/basis/classes/struct/struct-tests.factor @@ -5,7 +5,8 @@ destructors io.encodings.utf8 io.pathnames io.streams.string kernel libc literals math multiline namespaces prettyprint prettyprint.config see sequences specialized-arrays.ushort system tools.test compiler.tree.debugger struct-arrays -classes.tuple.private specialized-arrays.direct.int ; +classes.tuple.private specialized-arrays.direct.int +compiler.units ; IN: classes.struct.tests << @@ -22,6 +23,11 @@ IN: classes.struct.tests "f-stdcall" libfactor-ffi-tests-path "stdcall" add-library >> +SYMBOL: struct-test-empty + +[ [ struct-test-empty { } define-struct-class ] with-compilation-unit ] +[ struct-must-have-slots? ] must-fail-with + STRUCT: struct-test-foo { x char } { y int initial: 123 } diff --git a/basis/classes/struct/struct.factor b/basis/classes/struct/struct.factor index 93cb8e3203..52f3b7df9f 100644 --- a/basis/classes/struct/struct.factor +++ b/basis/classes/struct/struct.factor @@ -12,6 +12,8 @@ IN: classes.struct ! struct class +ERROR: struct-must-have-slots ; + TUPLE: struct { (underlying) c-ptr read-only } ; @@ -207,7 +209,10 @@ M: struct-class heap-size [ c-type>> c-type drop ] each ; : (define-struct-class) ( class slots offsets-quot -- ) - [ drop struct f define-tuple-class ] + [ + [ struct-must-have-slots ] + [ drop struct f define-tuple-class ] if-empty + ] swap '[ make-slots dup [ check-struct-slots ] _ [ struct-align [ align ] keep ] tri