diff --git a/pkgs/racket-test/tests/units/test-unit.rkt b/pkgs/racket-test/tests/units/test-unit.rkt index 981e3e772a..ea50ee3e65 100644 --- a/pkgs/racket-test/tests/units/test-unit.rkt +++ b/pkgs/racket-test/tests/units/test-unit.rkt @@ -2276,3 +2276,30 @@ (define result (foo 1 2 3)))) (test 7 (dynamic-require ''m 'result))) + +;; ---------------------------------------- +;; Contracts that use other contracted bindings work when exporting through define-values/invoke-unit + +(parameterize ([current-namespace (make-base-namespace)]) + (eval + '(module m racket/base + (require racket/contract + racket/unit) + + (provide g) + + (define-signature a^ + [(contracted + [f (-> integer? contract?)] + [g (f 10)])]) + + (define-unit a@ + (import) + (export a^) + (define (f x) (>=/c x)) + (define g 11)) + + (define-values/invoke-unit a@ + (import) + (export a^)))) + (test 11 (dynamic-require ''m 'g))) diff --git a/racket/collects/racket/private/unit-utils.rkt b/racket/collects/racket/private/unit-utils.rkt index 80ef7914b5..494fc6ca6c 100644 --- a/racket/collects/racket/private/unit-utils.rkt +++ b/racket/collects/racket/private/unit-utils.rkt @@ -51,10 +51,12 @@ member-table i)))] [(x . y) - (quote-syntax - (#,(add-ctc i (bound-identifier-mapping-get - member-table - i)) . y))])))]))) + (quasisyntax + (#,(quote-syntax + #,(add-ctc i (bound-identifier-mapping-get + member-table + i))) + . y))])))]))) (define-syntax (unit-export stx) (syntax-case stx ()