diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/contract/predicates.rkt b/pkgs/racket-pkgs/racket-test/tests/racket/contract/predicates.rkt index 19faa26b5d..a2ab8afec5 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/contract/predicates.rkt +++ b/pkgs/racket-pkgs/racket-test/tests/racket/contract/predicates.rkt @@ -215,6 +215,11 @@ (ctest #t flat-contract? (let () (struct s (a b)) (struct/dc s [a integer?] [b (a) #:flat (>=/c a)]))) + (ctest #t chaperone-contract? + (let () + (struct s (x)) + (struct/dc s [x () any/c] #:inv (x) #t))) + (contract-error-test 'struct/dc-not-really-flat-dep-field #'(let () diff --git a/racket/collects/racket/contract/private/struct-dc.rkt b/racket/collects/racket/contract/private/struct-dc.rkt index 8885835f2a..55a3123bd5 100644 --- a/racket/collects/racket/contract/private/struct-dc.rkt +++ b/racket/collects/racket/contract/private/struct-dc.rkt @@ -81,7 +81,7 @@ ;; the order specified in the contract itself) ;; muts : (listof mutator) -- the field mutators for mutable fields ;; on which the invariant depends -(struct invariant (dep-proc fields sels muts)) +(struct invariant (dep-proc fields sels muts) #:transparent) (define (subcontract-mutable-field? x) (or (mutable? x) @@ -672,12 +672,16 @@ (define (flat-subcontract? subcontract) (cond [(indep? subcontract) (flat-contract? (indep-ctc subcontract))] - [(dep? subcontract) (eq? '#:flat (dep-type subcontract))])) + [(dep? subcontract) (equal? '#:flat (dep-type subcontract))] + [(invariant? subcontract) #t] + [else (error 'struct-dc.rkt "internal error")])) (define (impersonator-subcontract? subcontract) (cond [(indep? subcontract) (impersonator-contract? (indep-ctc subcontract))] - [(dep? subcontract) (eq? '#:impersonator (dep-type subcontract))])) + [(dep? subcontract) (equal? '#:impersonator (dep-type subcontract))] + [(invariant? subcontract) #f] + [else (error 'struct-dc.rkt "internal error")])) (cond [(and (andmap flat-subcontract? subcontracts) (not (ormap subcontract-mutable-field? subcontracts)))