diff --git a/collects/mzlib/private/contract.ss b/collects/mzlib/private/contract.ss index 1468553637..bd62fed5a5 100644 --- a/collects/mzlib/private/contract.ss +++ b/collects/mzlib/private/contract.ss @@ -174,7 +174,8 @@ improve method arity mismatch contract violation error messages? [(null? clauses) null] [else (let ([clause (car clauses)]) - (syntax-case clause (struct rename) + ;; compare raw identifiers for `struct' and `rename' just like provide does + (syntax-case* clause (struct rename) (λ (x y) (eq? (syntax-e x) (syntax-e y))) [(rename this-name new-name contract) (and (identifier? (syntax this-name)) (identifier? (syntax new-name))) diff --git a/collects/tests/mzscheme/contract-test.ss b/collects/tests/mzscheme/contract-test.ss index bf22e0a8e8..cb1da99e32 100644 --- a/collects/tests/mzscheme/contract-test.ss +++ b/collects/tests/mzscheme/contract-test.ss @@ -5088,6 +5088,18 @@ so that propagation occurs. (eval 'pc19-ans)) 1) + ;; test that unit & contract don't collide over the name `struct' + (test/spec-passed + 'provide/contract20 + '(eval '(module tmp mzscheme + (require (lib "contract.ss") + (lib "unit.ss")) + + (define-struct s (a b)) + + (provide/contract + [struct s ([a number?] + [b symbol?])])))) (contract-error-test #'(begin