diff --git a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/env/type-alias-helper.rkt b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/env/type-alias-helper.rkt index 6a342b3929..dacc520f33 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/env/type-alias-helper.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/env/type-alias-helper.rkt @@ -68,6 +68,7 @@ [((Mu: _ body)) (check body)] [((Poly: names body)) (check body)] [((PolyDots: names body)) (check body)] + [((PolyRow: _ _ body)) (check body)] [(_) #t]) (unless (check type) (tc-error/stx diff --git a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/private/parse-type.rkt b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/private/parse-type.rkt index 490ece19ce..e9383e11b6 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/private/parse-type.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/private/parse-type.rkt @@ -376,6 +376,7 @@ [(Mu: _ body) (loop body)] [(Poly: names body) (loop body)] [(PolyDots: names body) (loop body)] + [(PolyRow: _ _ body) (loop body)] [else #t]))) (unless productive (parse-error diff --git a/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/unit-tests/parse-type-tests.rkt b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/unit-tests/parse-type-tests.rkt index 11ce2221c3..47889595e3 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/unit-tests/parse-type-tests.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/unit-tests/parse-type-tests.rkt @@ -117,6 +117,10 @@ (-polydots (a) ((list) [a a] . ->... . N))] [(All (a ...) (-> (values a ...))) (-polydots (a) (t:-> (make-ValuesDots (list) a 'a)))] + + ;; PR 14554, non-productive recursive type + [FAIL (Rec x (All (A #:row) x))] + [(case-lambda (Number -> Boolean) (Number Number -> Number)) (cl-> [(N) B] [(N N) N])] [(case-> (Number -> Boolean) (Number Number -> Number)) (cl-> [(N) B] diff --git a/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/unit-tests/typecheck-tests.rkt b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/unit-tests/typecheck-tests.rkt index 968b7ca669..c0c7e2360c 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/unit-tests/typecheck-tests.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/unit-tests/typecheck-tests.rkt @@ -2616,6 +2616,8 @@ #:msg "Recursive #:implements clause not allowed"] [tc-err (let () (define-type-alias X (U X #f)) "dummy") #:msg "Recursive types are not allowed directly inside"] + [tc-err (let () (define-type-alias X (All (A #:row) X)) "dummy") + #:msg "Recursive types are not allowed directly inside"] ;; Check the more precise Tarjan's algorithm-based letrec-values type checking [tc-e ;; An example from Eric Dobson (see gh372) that shows that precisely