From aeee35bccb54a5bf1ce1abe1c57305c3cdbf37d6 Mon Sep 17 00:00:00 2001 From: Asumu Takikawa Date: Thu, 24 Oct 2013 23:58:45 -0400 Subject: [PATCH] Allow re-definition at TR top-level original commit: e513cdc1c445f7d2ca15ef7033caada29ccf63ff --- .../typed-racket-lib/typed-racket/env/global-env.rkt | 4 ++-- .../typed-racket/typecheck/tc-toplevel.rkt | 3 ++- .../tests/typed-racket/succeed/toplevel-redefinition.rkt | 9 +++++++++ 3 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/succeed/toplevel-redefinition.rkt diff --git a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/env/global-env.rkt b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/env/global-env.rkt index be37369e..4fe82b6e 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/env/global-env.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/env/global-env.rkt @@ -73,8 +73,8 @@ (define (unregister-type id) (free-id-table-remove! the-mapping id)) -(define (finish-register-type id) - (unless (maybe-finish-register-type id) +(define (finish-register-type id [top-level? #f]) + (unless (or top-level? (maybe-finish-register-type id)) (tc-error/expr #:stx id "Duplicate definition for ~a" (syntax-e id))) (void)) diff --git a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/typecheck/tc-toplevel.rkt b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/typecheck/tc-toplevel.rkt index 8635473b..db884bfb 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/typecheck/tc-toplevel.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/typecheck/tc-toplevel.rkt @@ -167,7 +167,8 @@ (map make-def-binding vars ts))] ;; if this already had an annotation, we just construct the binding reps [(andmap (lambda (s) (lookup-type s (lambda () #f))) vars) - (for-each finish-register-type vars) + (define top-level? (eq? (syntax-local-context) 'top-level)) + (for ([var (in-list vars)]) (finish-register-type var top-level?)) (map (lambda (s) (make-def-binding s (lookup-type s))) vars)] ;; special case to infer types for top level defines [else diff --git a/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/succeed/toplevel-redefinition.rkt b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/succeed/toplevel-redefinition.rkt new file mode 100644 index 00000000..f3133c3c --- /dev/null +++ b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/succeed/toplevel-redefinition.rkt @@ -0,0 +1,9 @@ +#lang racket/load + +;; Test that variable redefinition works at the top-level + +(require typed/racket) +(: x Integer) +(define x 3) +(define x 5) +