From fc75ff426ab5e1afccc8fd1fba7343fbc93c1562 Mon Sep 17 00:00:00 2001 From: Asumu Takikawa Date: Fri, 12 Apr 2013 15:32:05 -0400 Subject: [PATCH] Fix #:methods regression at top-level Please merge to v5.3.4 (cherry picked from commit fa80c531156ef7f2e6b33063f89c6ee20609f4d2) --- collects/racket/private/define-struct.rkt | 7 ++++++- collects/tests/generic/tests.rkt | 3 ++- collects/tests/generic/top-level.rkt | 20 ++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 collects/tests/generic/top-level.rkt diff --git a/collects/racket/private/define-struct.rkt b/collects/racket/private/define-struct.rkt index 8d763759e3..a49f2754d4 100644 --- a/collects/racket/private/define-struct.rkt +++ b/collects/racket/private/define-struct.rkt @@ -319,7 +319,12 @@ (raise-syntax-error #f "not a name for a generics group" gen:foo gen:foo)) - (unless (and (identifier? gen:foo) (identifier-binding gen:foo)) + (unless (and (identifier? gen:foo) + ;; at the top-level, it's not possible to check + ;; if this `gen:foo` is bound, so we give up on the + ;; error message in that case + (or (eq? (syntax-local-context) 'top-level) + (identifier-binding gen:foo))) (bad-generics)) (define gen:foo-val (syntax-local-value gen:foo)) (unless (and (list? gen:foo-val) diff --git a/collects/tests/generic/tests.rkt b/collects/tests/generic/tests.rkt index b0d58c37ac..fdfb04cc14 100644 --- a/collects/tests/generic/tests.rkt +++ b/collects/tests/generic/tests.rkt @@ -15,4 +15,5 @@ "contract.rkt" "from-unstable.rkt" "poly-contracts.rkt" - "empty-interface.rkt") + "empty-interface.rkt" + "top-level.rkt") diff --git a/collects/tests/generic/top-level.rkt b/collects/tests/generic/top-level.rkt new file mode 100644 index 0000000000..49fc6c5595 --- /dev/null +++ b/collects/tests/generic/top-level.rkt @@ -0,0 +1,20 @@ +#lang racket/base + +;; check that generics work at the top-level + +(require racket/generic + rackunit) + +(define ns (make-base-namespace)) + +(check-not-exn + (λ () + (eval '(require racket/generic) ns) + (eval '(define-generics foobar [foo foobar a1]) ns) + (eval '(struct inst () + ;; make sure `gen:foobar` doesn't cause an + ;; error here + #:methods gen:foobar + [(define (foo foobar a1) 0)]) + ns))) +