diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/contract/struct-dc.rkt b/pkgs/racket-pkgs/racket-test/tests/racket/contract/struct-dc.rkt index e96d209e01..b5feb5278a 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/contract/struct-dc.rkt +++ b/pkgs/racket-pkgs/racket-test/tests/racket/contract/struct-dc.rkt @@ -1074,6 +1074,20 @@ 'pos 'neg))) + (test/spec-passed/result + 'struct/dc-inv6 + '(let () + (struct s (f)) + ((struct/dc s [f any/c] #:inv (f) (equal? f 11)) (s 12))) + #f) + + (test/spec-passed/result + 'struct/dc-inv7 + '(let () + (struct s (f)) + ((struct/dc s [f any/c] #:inv (f) (equal? f 11)) (s 11))) + #t) + (contract-error-test 'struct/dc-imp-nondep-runtime-error '(let () diff --git a/racket/collects/racket/contract/private/struct-dc.rkt b/racket/collects/racket/contract/private/struct-dc.rkt index ddae1237a7..9a78c8aabe 100644 --- a/racket/collects/racket/contract/private/struct-dc.rkt +++ b/racket/collects/racket/contract/private/struct-dc.rkt @@ -176,15 +176,19 @@ (cond [(null? subcs) #t] [else - (define subc (car subcs)) - (define val ((subcontract-ref subc) v)) + (define subc (car subcs)) (cond - [(indep? subc) - (and ((flat-contract-predicate (indep-ctc subc)) val) - (loop (cdr subcs) (cons val args)))] + [(invariant? subc) + (apply (invariant-dep-proc subc) args)] [else - (and ((flat-contract-predicate (apply (dep-dep-proc subc) args)) val) - (loop (cdr subcs) (cons val args)))])]))))) + (define val ((subcontract-ref subc) v)) + (cond + [(indep? subc) + (and ((flat-contract-predicate (indep-ctc subc)) val) + (loop (cdr subcs) (cons val args)))] + [else + (and ((flat-contract-predicate (apply (dep-dep-proc subc) args)) val) + (loop (cdr subcs) (cons val args)))])])]))))) (define (struct/dc-first-order ctc) (base-struct/dc-pred ctc))