Better error message for multiple ->
Closes PR 10493.
This commit is contained in:
parent
efbdfd3e6e
commit
75bd26d326
6
collects/tests/typed-scheme/fail/multi-arr-parse.rkt
Normal file
6
collects/tests/typed-scheme/fail/multi-arr-parse.rkt
Normal file
|
@ -0,0 +1,6 @@
|
|||
#;
|
||||
(exn-pred 1 ".*once in a form.*")
|
||||
#lang typed/scheme
|
||||
|
||||
(: foo : (Integer -> Integer -> Integer))
|
||||
(define foo 1)
|
|
@ -204,6 +204,12 @@
|
|||
(add-type-name-reference #'kw)
|
||||
(-Param (parse-type #'t1) (parse-type #'t2))]
|
||||
;; function types
|
||||
;; handle this error first:
|
||||
[((~or dom (~between (~and kw t:->) 2 +inf.0)) ...)
|
||||
(for ([k (syntax->list #'(kw ...))]) (add-type-name-reference k))
|
||||
(tc-error/stx (syntax->list #'(kw ...))
|
||||
"The -> type constructor may be used only once in a form")
|
||||
Err]
|
||||
[(dom (~and kw t:->) rng : ~! latent:latent-filter)
|
||||
(add-type-name-reference #'kw)
|
||||
;; use parse-type instead of parse-values-type because we need to add the filters from the pred-ty
|
||||
|
@ -247,11 +253,14 @@
|
|||
;; use expr to rule out keywords
|
||||
[(dom:expr ... kws:keyword-tys ... (~and kw t:->) rng)
|
||||
(add-type-name-reference #'kw)
|
||||
(make-Function
|
||||
(list (make-arr
|
||||
(map parse-type (syntax->list #'(dom ...)))
|
||||
(parse-values-type #'rng)
|
||||
#:kws (attribute kws.Keyword))))]
|
||||
(let ([doms (for/list ([d (syntax->list #'(dom ...))])
|
||||
(let ([dt (parse-type d)])
|
||||
(if (type-equal? dt Err) Univ dt)))])
|
||||
(make-Function
|
||||
(list (make-arr
|
||||
doms
|
||||
(parse-values-type #'rng)
|
||||
#:kws (attribute kws.Keyword)))))]
|
||||
|
||||
[id:identifier
|
||||
(cond
|
||||
|
|
Loading…
Reference in New Issue
Block a user