From ce324be9f8b8ad8b88bc3a39e7b1de438b462c87 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Fri, 15 Mar 2019 22:11:16 -0500 Subject: [PATCH] adjust contract-out to use fresh scopes for mangled identifiers closes #2469 --- .../tests/racket/contract/contract-out.rkt | 12 +++++++++ .../racket/contract/private/provide.rkt | 25 +++++++++++-------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/pkgs/racket-test/tests/racket/contract/contract-out.rkt b/pkgs/racket-test/tests/racket/contract/contract-out.rkt index a124c7a626..7256b2037a 100644 --- a/pkgs/racket-test/tests/racket/contract/contract-out.rkt +++ b/pkgs/racket-test/tests/racket/contract/contract-out.rkt @@ -1230,6 +1230,18 @@ (eval '(dynamic-require ''provide/contract66-m2 #f))) "provide/contract66-m1") + (test/spec-passed + 'provide/contract67 + '(let () + (eval '(module provide/contract67-a racket/base + (require racket/contract/base) + (struct stream (x [y #:mutable])) + (provide (contract-out (struct stream ([x any/c] [y any/c])))))) + + (eval '(module provide/contract67-b racket/base + (require 'provide/contract67-a racket/contract/base) + (provide (contract-out (struct stream ([x any/c] [y any/c])))))))) + (contract-error-test 'provide/contract-struct-out #'(begin diff --git a/racket/collects/racket/contract/private/provide.rkt b/racket/collects/racket/contract/private/provide.rkt index 9d48166fc5..ba305a0604 100644 --- a/racket/collects/racket/contract/private/provide.rkt +++ b/racket/collects/racket/contract/private/provide.rkt @@ -460,6 +460,8 @@ [(_ p/c-ele ...) (let () + (define mangled-id-scope (make-syntax-introducer)) + ;; ids : table[id -o> (listof id)] ;; code-for-each-clause adds identifiers to this map. ;; when it binds things; they are then used to signal @@ -710,9 +712,10 @@ #t))] [mutator-ids (reverse (list-ref the-struct-info 4))] ;; (listof (union #f identifier)) [field-contract-ids (map (λ (field-name field-contract) - (a:mangle-id "provide/contract-field-contract" - field-name - struct-name)) + (mangled-id-scope + (a:mangle-id "provide/contract-field-contract" + field-name + struct-name))) field-names field-contracts)] [struct:struct-name @@ -1083,11 +1086,12 @@ (syntax code))) (define (id-for-one-id user-rename-id reflect-id id [mangle-for-maker? #f]) - ((if mangle-for-maker? - a:mangle-id-for-maker - a:mangle-id) - "provide/contract-id" - (or user-rename-id reflect-id id))) + (mangled-id-scope + ((if mangle-for-maker? + a:mangle-id-for-maker + a:mangle-id) + "provide/contract-id" + (or user-rename-id reflect-id id)))) (define pos-module-source-id ;; Avoid context on this identifier, since it will be defined @@ -1118,8 +1122,9 @@ (free-identifier-mapping-put! struct-id-mapping a - (a:mangle-id "provide/contract-struct-expandsion-info-id" - a)) + (mangled-id-scope + (a:mangle-id "provide/contract-struct-expandsion-info-id" + a))) (define parent-selectors (if parent (let ([parent-selectors (list-ref (extract-struct-info (syntax-local-value parent))