From 3e7c9bcadfc5e063e7a5b10577a7d90865259d6b Mon Sep 17 00:00:00 2001 From: Asumu Takikawa Date: Wed, 20 Nov 2013 18:42:28 -0500 Subject: [PATCH] Fix `provide:` when it's after the definition Closes PR 11172 Please merge into 6.0 (cherry picked from commit 7e1b3c306d57b5f7d56a16c468518a790c7952ac) --- .../typed-racket-lib/typed-racket/base-env/prims.rkt | 12 ++++++++++-- .../tests/typed-racket/succeed/pr11172.rkt | 12 ++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/succeed/pr11172.rkt diff --git a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/base-env/prims.rkt b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/base-env/prims.rkt index dcfff065a4..c1ed8e0258 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/base-env/prims.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/base-env/prims.rkt @@ -1097,9 +1097,17 @@ This file defines two sorts of primitives. All of them are provided into any mod (define-syntax (provide: stx) (syntax-parse stx [(_ [i:id t] ...) + ;; indirection through i*s allows `provide: to come + ;; before the original definitions/type annotations + (define i*s (generate-temporaries #'(i ...))) + (for ([i* (in-list i*s)] + [i (in-list (syntax->list #'(i ...)))]) + ;; lift allows `provide:` to come before original definition + (syntax-local-lift-module-end-declaration #`(define #,i* #,i))) + (define/with-syntax (i* ...) i*s) (syntax/loc stx - (begin (: i t) ... - (provide i ...)))])) + (begin (: i* t) ... + (provide (rename-out [i* i] ...))))])) (define-syntax (declare-refinement stx) (syntax-parse stx diff --git a/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/succeed/pr11172.rkt b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/succeed/pr11172.rkt new file mode 100644 index 0000000000..91758d2dc7 --- /dev/null +++ b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/succeed/pr11172.rkt @@ -0,0 +1,12 @@ +#lang racket/load + +;; Test for PR 11172 + +(module a typed/racket (: n Positive-Integer) (define n 10) (provide: [n Integer])) +(module b typed/racket (define n 10) (provide: [n Integer])) +(module c typed/racket (provide: [n Integer]) (define n 10)) +(module d typed/racket (provide: [n Integer]) (: n Positive-Integer) (define n 10)) + +(require 'a) +n +