From 77334808a852ac04d0595d659edda15f8f9ce58c Mon Sep 17 00:00:00 2001 From: Brian Lachance Date: Mon, 29 Jun 2015 17:25:15 -0400 Subject: [PATCH] Allow AnyValues as a return type in user code Closes PR 14217 --- typed-racket-lib/typed-racket/base-env/base-types-extra.rkt | 2 +- typed-racket-lib/typed-racket/private/parse-type.rkt | 5 ++++- typed-racket-test/succeed/pr14217.rkt | 5 +++++ typed-racket-test/unit-tests/parse-type-tests.rkt | 1 + 4 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 typed-racket-test/succeed/pr14217.rkt diff --git a/typed-racket-lib/typed-racket/base-env/base-types-extra.rkt b/typed-racket-lib/typed-racket/base-env/base-types-extra.rkt index 8087f5d2..6b04dc76 100644 --- a/typed-racket-lib/typed-racket/base-env/base-types-extra.rkt +++ b/typed-racket-lib/typed-racket/base-env/base-types-extra.rkt @@ -16,7 +16,7 @@ ;; special type names that are not bound to particular types (define-other-types -> ->* case-> U Rec All Opaque Vector - Parameterof List List* Class Object Values Instance Refinement + Parameterof List List* Class Object Values AnyValues Instance Refinement pred Struct Struct-Type Prefab Top Bot Distinction) (provide (rename-out [All ∀] diff --git a/typed-racket-lib/typed-racket/private/parse-type.rkt b/typed-racket-lib/typed-racket/private/parse-type.rkt index c5b2201c..29f20350 100644 --- a/typed-racket-lib/typed-racket/private/parse-type.rkt +++ b/typed-racket-lib/typed-racket/private/parse-type.rkt @@ -98,6 +98,7 @@ (define-literal-syntax-class #:for-label Prefab) (define-literal-syntax-class #:for-label Values) (define-literal-syntax-class #:for-label values) +(define-literal-syntax-class #:for-label AnyValues) (define-literal-syntax-class #:for-label Top) (define-literal-syntax-class #:for-label Bot) (define-literal-syntax-class #:for-label Distinction) @@ -622,7 +623,7 @@ (-Tuple (parse-types #'(tys ...)))]))) ;; Syntax -> Type -;; Parse a (Values ...) type +;; Parse a (Values ...) or AnyValues type (define (parse-values-type stx) (parameterize ([current-orig-stx stx]) (syntax-parse stx @@ -644,6 +645,7 @@ var))] [((~or :Values^ :values^) tys ...) (-values (parse-types #'(tys ...)))] + [:AnyValues^ ManyUniv] [t (-values (list (parse-type #'t)))]))) @@ -874,6 +876,7 @@ (ret (parse-types #'(t ...)) (stx-map (lambda (x) -no-filter) #'(t ...)) (stx-map (lambda (x) -no-obj) #'(t ...)))] + [:AnyValues^ (tc-any-results -no-filter)] [t (ret (parse-type #'t) -no-filter -no-obj)])) (define parse-type/id (parse/id parse-type)) diff --git a/typed-racket-test/succeed/pr14217.rkt b/typed-racket-test/succeed/pr14217.rkt new file mode 100644 index 00000000..f4dc89a7 --- /dev/null +++ b/typed-racket-test/succeed/pr14217.rkt @@ -0,0 +1,5 @@ +#lang typed/racket +(: foo (-> Integer AnyValues)) +(define (foo x) + x) +(foo 5) diff --git a/typed-racket-test/unit-tests/parse-type-tests.rkt b/typed-racket-test/unit-tests/parse-type-tests.rkt index 884d3d5a..7fbe1ba0 100644 --- a/typed-racket-test/unit-tests/parse-type-tests.rkt +++ b/typed-racket-test/unit-tests/parse-type-tests.rkt @@ -134,6 +134,7 @@ (-polydots (a) ((list) [a a] . ->... . N))] [(All (a ...) (-> (values a ...))) (-polydots (a) (t:-> (make-ValuesDots (list) a 'a)))] + [(-> Number AnyValues) (t:-> N ManyUniv)] ;; PR 14554, non-productive recursive type [FAIL (Rec x (All (A #:row) x))]