diff --git a/collects/racket/contract/private/struct-dc.rkt b/collects/racket/contract/private/struct-dc.rkt index 8d28bdb22a..2c78297993 100644 --- a/collects/racket/contract/private/struct-dc.rkt +++ b/collects/racket/contract/private/struct-dc.rkt @@ -1,7 +1,7 @@ #lang racket/base -(provide (rename-out [-struct/dc struct/dc]) - struct/c) +(provide (rename-out [-struct/dc struct/dc] + [-struct/c struct/c])) (require (for-syntax racket/base racket/list @@ -958,13 +958,13 @@ '(expected "a struct of type ~a") what)) -(define-syntax (struct/c stx) +(define-syntax (-struct/c stx) (syntax-case stx () [(_ . args) - (with-syntax ([x (syntax/loc stx (do-struct/c . args))]) + (with-syntax ([x (syntax/loc stx (struct/c . args))]) (syntax/loc stx (#%expression x)))])) -(define-syntax (do-struct/c stx) +(define-syntax (struct/c stx) (syntax-case stx () [(_ struct-name args ...) (and (identifier? (syntax struct-name)) @@ -993,7 +993,7 @@ (define strip-reg (regexp (format "^~a-" (regexp-quote (symbol->string (syntax-e #'struct-name)))))) (define (selector-id->field sel) - (datum->syntax #'struct-name + (datum->syntax sel (string->symbol (regexp-replace strip-reg (symbol->string (syntax-e sel)) "")))) (do-struct/dc diff --git a/collects/tests/racket/contract-test.rktl b/collects/tests/racket/contract-test.rktl index a8dca12b04..136689018e 100644 --- a/collects/tests/racket/contract-test.rktl +++ b/collects/tests/racket/contract-test.rktl @@ -14004,6 +14004,33 @@ so that propagation occurs. (provide (contract-out garbage)) (λ))) #rx"contract-out") + + (test/pos-blame + 'contract-struct/c-1 + '(begin + (eval '(module contract-struct/c-1a racket/base + (struct s (field)) + (provide s))) + (eval '(module contract-struct/c-1b racket/base + (require 'contract-struct/c-1a racket/contract) + (contract (struct/c s boolean?) + (s 1) + 'pos 'neg))) + (eval '(require 'contract-struct/c-1b)))) + + (test/spec-passed + 'contract-struct/c-2 + '(begin + (eval '(module contract-struct/c-2a racket/base + (struct s (field)) + (provide s))) + (eval '(module contract-struct/c-2b racket/base + (require 'contract-struct/c-2a racket/contract) + (contract (struct/c s any/c) + (s 1) + 'pos 'neg))) + (eval '(require 'contract-struct/c-2b)))) + ; ;