diff --git a/collects/racket/contract/private/arrow.rkt b/collects/racket/contract/private/arrow.rkt index 8d7bbb2999..f5a9cb1c23 100644 --- a/collects/racket/contract/private/arrow.rkt +++ b/collects/racket/contract/private/arrow.rkt @@ -1866,8 +1866,9 @@ v4 todo: (define (keywords-match mandatory-kwds optional-kwds val) (let-values ([(proc-mandatory proc-all) (procedure-keywords val)]) (and ;; proc accepts all ctc's mandatory keywords - (andmap (λ (kwd) (member kwd proc-all)) - mandatory-kwds) + (or (not proc-all) + (andmap (λ (kwd) (member kwd proc-all)) + mandatory-kwds)) ;; proc's mandatory keywords are still mandatory in ctc (andmap (λ (kwd) (member kwd mandatory-kwds)) proc-mandatory) diff --git a/collects/tests/racket/contract-test.rktl b/collects/tests/racket/contract-test.rktl index 0ab6b5db13..fae1e7d6a9 100644 --- a/collects/tests/racket/contract-test.rktl +++ b/collects/tests/racket/contract-test.rktl @@ -1070,6 +1070,18 @@ 'contract-arrow-any3 '((contract (integer? . -> . any) (lambda (x) #f) 'pos 'neg) #t)) + (test/spec-passed + 'contract-arrow-all-kwds + '(contract (-> #:a string? string?) + (make-keyword-procedure void) + 'pos 'neg)) + + (test/spec-passed + 'contract-arrow-all-kwds2 + '((contract (-> #:a string? void?) + (make-keyword-procedure void) + 'pos 'neg) + #:a "abcdef")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;