racket/unit: fix signature handling of define-values/invoke-unit/infer

Closes PR 14453
This commit is contained in:
Matthew Flatt 2014-05-26 08:38:44 +01:00
parent cd9e46edc2
commit 7137c8d6a6
3 changed files with 39 additions and 5 deletions

View File

@ -1855,4 +1855,36 @@
;; ----------------------------------------
(module check-define-values-invoke-unit-spec racket/base
(require racket/unit)
(define-signature a^ (foo))
(define-signature b^ (bar))
(define-unit works@
(import) (export a^) (define foo 'foo))
(define-values/invoke-unit/infer
(export (rename a^ [qux foo]))
works@)
(define-unit doesnt@
(import) (export b^) (define bar 0))
(define-unit work@
(import b^) (export a^) (define foo bar))
;; No rename on export
(define-values/invoke-unit/infer
(export a^)
(link doesnt@ work@))
;; Rename on export
(define-values/invoke-unit/infer
(export (rename a^ [baz foo]))
(link doesnt@ work@))
(provide results)
(define results (list foo baz)))
(test '(0 0) (dynamic-require ''check-define-values-invoke-unit-spec 'results))
;; ----------------------------------------
(displayln "tests passed")

View File

@ -56,8 +56,8 @@
(define check-tagged-id (check-tagged check-id))
;; check-spec-syntax : syntax-object boolean (syntax-object -> boolean) ->
;; ensures that s matches spec.
;; check-spec-syntax : syntax-object boolean (syntax-object -> boolean) -> prim-spec?
;; ensures that s matches spec, returns the core prim-spec (which is usually an identifier)
;; tag-spec ::= spec
;; | (tag symbol spec)
;; spec ::= prim-spec
@ -69,7 +69,9 @@
((check-tagged (λ (s) (check-spec-syntax s import? prim-spec?))) s))
(define (check-spec-syntax s import? prim-spec?)
(unless (prim-spec? s)
(cond
[(prim-spec? s) s]
[else
(let ((ie (if import? 'import 'export)))
(unless (stx-pair? s)
(raise-stx-err (format "bad ~a spec" ie) s))
@ -124,7 +126,7 @@
(syntax->list #'(clause ...)))
(check-spec-syntax #'sub-s import? prim-spec?)))
((k . x)
(raise-stx-err (format "bad ~a-spec keyword" ie) #'k))))))
(raise-stx-err (format "bad ~a-spec keyword" ie) #'k))))]))
;; check-unit-syntax : syntax-object -> syntax-object
;; ensures that stx matches ((import i ...) (export e ...) b ...)

View File

@ -2101,7 +2101,7 @@
[exports
(map
(lambda (e)
(define tid (check-tagged-id e))
(define tid (check-tagged-spec-syntax e #f identifier?))
(define lookup (bound-identifier-mapping-get
lnk-table
(cdr tid)