diff --git a/core/classes/union/union-tests.factor b/core/classes/union/union-tests.factor index 6f927441a4..aeadd687c2 100644 --- a/core/classes/union/union-tests.factor +++ b/core/classes/union/union-tests.factor @@ -136,3 +136,10 @@ PREDICATE: numba-ova-10 < union{ float integer } ! Issue #420 lol [ "IN: issue-420 UNION: omg omg ;" eval( -- ) ] [ error>> cannot-reference-self? ] must-fail-with + +IN: issue-420 +UNION: a ; +UNION: b a ; + +[ "IN: issue-420 UNION: a b ;" eval( -- ) ] +[ error>> cannot-reference-self? ] must-fail-with diff --git a/core/classes/union/union.factor b/core/classes/union/union.factor index 2a0afef3a1..c2e6af41ff 100644 --- a/core/classes/union/union.factor +++ b/core/classes/union/union.factor @@ -4,6 +4,7 @@ USING: accessors assocs classes classes.algebra classes.algebra.private classes.builtin classes.private combinators definitions kernel kernel.private math math.private quotations sequences words ; +FROM: sets => set= ; IN: classes.union PREDICATE: union-class < class @@ -55,8 +56,15 @@ M: union-class update-class define-union-predicate ; ERROR: cannot-reference-self class members ; +: union-members ( union -- members ) + "members" word-prop [ f ] when-empty ; + : check-self-reference ( class members -- class members ) - 2dup member-eq? [ cannot-reference-self ] when ; + 2dup [ + dup dup [ union-members ] map concat sift append + 2dup set= [ 2drop f ] [ nip ] if + ] follow concat + member-eq? [ cannot-reference-self ] when ; PRIVATE>