From 990555cd8dee2597b7a77ef743765161558df1b7 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Fri, 26 Feb 2016 08:05:32 -0600 Subject: [PATCH] fix arity checking for -> contract with ellipses closes #1266 --- pkgs/racket-test/tests/racket/contract/arrow.rkt | 5 +++++ .../racket/contract/private/arity-checking.rkt | 11 ++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/pkgs/racket-test/tests/racket/contract/arrow.rkt b/pkgs/racket-test/tests/racket/contract/arrow.rkt index 957f936f1a..b5d5ce0a99 100644 --- a/pkgs/racket-test/tests/racket/contract/arrow.rkt +++ b/pkgs/racket-test/tests/racket/contract/arrow.rkt @@ -367,6 +367,11 @@ (λ args args) 'pos 'neg) 1 2 3 4 #f 6 7)) + (test/spec-passed + 'contract->...5 + '(contract (-> procedure? any/c ... list? any) + (λ (proc last . stuff) stuff) + 'pos 'neg)) (test/spec-passed diff --git a/racket/collects/racket/contract/private/arity-checking.rkt b/racket/collects/racket/contract/private/arity-checking.rkt index 7f3bb9d7b7..065be9c940 100644 --- a/racket/collects/racket/contract/private/arity-checking.rkt +++ b/racket/collects/racket/contract/private/arity-checking.rkt @@ -1,6 +1,7 @@ #lang racket/base (require "blame.rkt" - "kwd-info-struct.rkt") + "kwd-info-struct.rkt" + "list.rkt") (provide do-arity-checking @@ -24,7 +25,11 @@ (define arity (if (list? (procedure-arity val)) (procedure-arity val) (list (procedure-arity val)))) - (define expected-number-of-non-keyword-args (length ->stct-doms)) + + (define exra-required-args (if (ellipsis-rest-arg-ctc? ->stct-rest) + (length (*list-ctc-suffix ->stct-rest)) + 0)) + (define expected-number-of-non-keyword-args (+ (length ->stct-doms) exra-required-args)) (define matching-arity? (and (for/or ([a (in-list arity)]) (or (equal? expected-number-of-non-keyword-args a) @@ -33,7 +38,7 @@ (if ->stct-rest (let ([lst (car (reverse arity))]) (and (arity-at-least? lst) - (<= (arity-at-least-value lst) ->stct-min-arity))) + (<= (arity-at-least-value lst) (+ exra-required-args ->stct-min-arity)))) #t))) (unless matching-arity? (k