diff --git a/pkgs/racket-test-core/tests/racket/object.rktl b/pkgs/racket-test-core/tests/racket/object.rktl index 8c75161bd6..cceb878186 100644 --- a/pkgs/racket-test-core/tests/racket/object.rktl +++ b/pkgs/racket-test-core/tests/racket/object.rktl @@ -1235,6 +1235,40 @@ (super-new)))]) (test 16 'send-using-local (send (new c%) pub 3))) +;; Make sure local names are checked correctly for deciding +;; conflicting method names: +(let () + (define-syntax-rule (defclss name% x y) + (begin + (define-local-member-name f) + (define name% + (class object% + (super-new) + (define/public (f) 5) + (define/public (x) 6) + (define/public (y) 7))) + (test 5 'local-f (send (new name%) f)))) + + (defclss one% f y) + (test 6 'normal-f (send (new one%) f)) + (test 7 'normal-y (send (new one%) y)) + + (define-syntax-rule (defclss2 name% x) + (begin + (define-local-member-name f) + (defclss name% f x) + (test 6 'middle-f (send (new name%) f)))) + + (defclss2 two% f) + (test 7 'normal-f (send (new two%) f))) + +(syntax-test #'(let () + (define-local-member-name f) + (class object% + (super-new) + (define/public (f) 5) + (define/public (f) 6)))) + ;; ------------------------------------------------------------ ;; `send+' tests diff --git a/racket/collects/racket/private/class-internal.rkt b/racket/collects/racket/private/class-internal.rkt index 881fa42f6e..9449402a53 100644 --- a/racket/collects/racket/private/class-internal.rkt +++ b/racket/collects/racket/private/class-internal.rkt @@ -1137,9 +1137,15 @@ (lambda (what l) (let ([ht (make-hasheq)]) (for-each (lambda (id) - (when (hash-ref ht (syntax-e id) #f) + (define key (let ([l-id (lookup-localize id)]) + (if (identifier? l-id) + (syntax-e l-id) + ;; For a given localized id, `lookup-localize` + ;; will return the same (eq?) value + l-id))) + (when (hash-ref ht key #f) (bad (format "duplicate declared external ~a name" what) id)) - (hash-set! ht (syntax-e id) #t)) + (hash-set! ht key #t)) l)))]) ;; method names (check-dup "method" (map cdr (append publics overrides augrides