From ade36c36c6f68520deb15c7152cc1e49741213d6 Mon Sep 17 00:00:00 2001 From: Sam Tobin-Hochstadt Date: Tue, 14 Aug 2012 11:57:14 -0400 Subject: [PATCH] Don't special-case applications with instantiations. Closes PR 13006. --- collects/tests/typed-racket/unit-tests/typecheck-tests.rkt | 4 ++++ collects/typed-racket/typecheck/tc-app-helper.rkt | 5 +++++ collects/typed-racket/typecheck/tc-app.rkt | 4 +++- collects/typed-racket/typecheck/tc-app/tc-app-hetero.rkt | 6 ------ 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/collects/tests/typed-racket/unit-tests/typecheck-tests.rkt b/collects/tests/typed-racket/unit-tests/typecheck-tests.rkt index 67301df261..282eecea39 100644 --- a/collects/tests/typed-racket/unit-tests/typecheck-tests.rkt +++ b/collects/tests/typed-racket/unit-tests/typecheck-tests.rkt @@ -1508,6 +1508,10 @@ Univ] [tc-e ((inst vector Index) 0) (-vec -Index)] + [tc-err ((inst list Void) 1 2 3)] + [tc-e ((inst list Any) 1 2 3) + (-lst Univ)] + ) (test-suite "check-type tests" diff --git a/collects/typed-racket/typecheck/tc-app-helper.rkt b/collects/typed-racket/typecheck/tc-app-helper.rkt index 3f4454ae75..2ba7436d8f 100644 --- a/collects/typed-racket/typecheck/tc-app-helper.rkt +++ b/collects/typed-racket/typecheck/tc-app-helper.rkt @@ -1,6 +1,7 @@ #lang racket/base (require "../utils/utils.rkt" racket/match unstable/list unstable/sequence + syntax/parse (only-in srfi/1 unzip4) (only-in racket/list make-list) (prefix-in c: racket/contract) "check-below.rkt" "tc-subst.rkt" @@ -10,6 +11,10 @@ (provide (all-defined-out)) +(define-syntax-class special-op + (pattern i:identifier + #:when (or (syntax-property #'i 'type-inst) + (syntax-property #'i 'type-ascription)))) ;; syntax? syntax? arr? (listof tc-results?) (or/c #f tc-results) [boolean?] -> tc-results? (define/cond-contract (tc/funapp1 f-stx args-stx ftype0 argtys expected #:check [check? #t]) diff --git a/collects/typed-racket/typecheck/tc-app.rkt b/collects/typed-racket/typecheck/tc-app.rkt index 11bb950a46..1f62f41e5d 100644 --- a/collects/typed-racket/typecheck/tc-app.rkt +++ b/collects/typed-racket/typecheck/tc-app.rkt @@ -275,6 +275,8 @@ vector-ref unsafe-vector-ref unsafe-vector*-ref vector-set! unsafe-vector-set! unsafe-vector*-set! unsafe-struct-ref unsafe-struct*-ref unsafe-struct-set! unsafe-struct*-set!) + ;; bail out immediately if we have one of these + [(#%plain-app rator:special-op . rands) (tc/app/regular form expected)] [(#%plain-app extend-parameterization pmz args ...) (let loop ([args (syntax->list #'(args ...))]) (if (null? args) (ret Univ) @@ -525,7 +527,7 @@ (tc/let-values #'((x) ... (rst)) #`(fixed-args ... varg) #'body #'(let-values ([(x) fixed-args] ... [(rst) varg]) . body) expected)))] - [else (tc/app/regular form expected)]))) + [_ (tc/app/regular form expected)]))) (define (tc/app/regular form expected) (syntax-parse form #:literals (#%plain-app) diff --git a/collects/typed-racket/typecheck/tc-app/tc-app-hetero.rkt b/collects/typed-racket/typecheck/tc-app/tc-app-hetero.rkt index 435f501d27..ca4d37cd06 100644 --- a/collects/typed-racket/typecheck/tc-app/tc-app-hetero.rkt +++ b/collects/typed-racket/typecheck/tc-app/tc-app-hetero.rkt @@ -91,12 +91,6 @@ (single-value val-e) (index-error i-val i-bound i-e vec-t expected) name])) - -(define-syntax-class special-op - (pattern i:identifier - #:when (or (syntax-property #'i 'type-inst) - (syntax-property #'i 'type-ascription)))) - (define (tc/app-hetero form expected) (syntax-parse form #:literals (#%plain-app