fix syntax checking for `case'

Merge to v5.3.1
(cherry picked from commit f43172128b)
This commit is contained in:
Matthew Flatt 2012-10-24 13:12:22 -07:00 committed by Ryan Culpepper
parent f61c3ca3f8
commit 4f504e5f19
3 changed files with 54 additions and 14 deletions

View File

@ -32,18 +32,45 @@
(case/dispatch tmp [(k ...) e1 e2 ...] ... [else x1 x2 ...]))))] (case/dispatch tmp [(k ...) e1 e2 ...] ... [else x1 x2 ...]))))]
;; Error cases ;; Error cases
[(_ v (bad e1 e2 ...) . rest) [(_ v clause ...)
(let loop ([clauses (syntax->list #'(clause ...))])
(unless (null? clauses)
(let ([clause (car clauses)])
(syntax-case clause ()
[((_ ...) _ _ ...)
(loop (cdr clauses))]
[((_ ...) . _)
(syntax-case clause ()
[(_)
(raise-syntax-error
#f
"bad syntax (missing expression after datum sequence)"
stx
clause)]
[(_ . _)
(raise-syntax-error
#f
"bad syntax (illegal use of `.' in clause)"
stx
clause)]
[_
(raise-syntax-error
#f
"bad syntax (ill-formed clause)"
stx
clause)])]
[(bad . _)
(raise-syntax-error (raise-syntax-error
#f #f
"bad syntax (not a datum sequence)" "bad syntax (not a datum sequence)"
stx stx
(syntax bad))] (syntax bad))]
[(_ v clause . rest) [_
(raise-syntax-error (raise-syntax-error
#f #f
"bad syntax (missing expression after datum sequence)" "bad syntax (ill-formed clause)"
stx stx
(syntax clause))] (syntax bad))]))))]
[(_ . v) [(_ . v)
(not (null? (syntax-e (syntax v)))) (not (null? (syntax-e (syntax v))))
(raise-syntax-error (raise-syntax-error

View File

@ -315,6 +315,16 @@
[else #f]))) [else #f])))
(error-test #'(cond [(values 1 2) 8]) arity?) (error-test #'(cond [(values 1 2) 8]) arity?)
(error-test #'(case (values 1 2) [(a) 8]) arity?) (error-test #'(case (values 1 2) [(a) 8]) arity?)
(syntax-test #'(case 1 []) #rx"ill-formed clause")
(syntax-test #'(case 1 [(y) 5] []) #rx"ill-formed clause")
(syntax-test #'(case 1 [x]) #rx"not a datum sequence")
(syntax-test #'(case 1 [(y) 5] [x]) #rx"not a datum sequence")
(syntax-test #'(case 1 [(y) 5] [x x]) #rx"not a datum sequence")
(syntax-test #'(case 1 [x x]) #rx"not a datum sequence")
(syntax-test #'(case 1 [(x)]) #rx"missing expression after datum sequence")
(syntax-test #'(case 1 [(y) 5] [(x)]) #rx"missing expression after datum sequence")
(syntax-test #'(case 1 [(x) . 8]) #rx"illegal use of `.'")
(syntax-test #'(case 1 [(x) 10] . 9) #rx"illegal use of `.'")
;; test larger `case' dispatches to trigger for binary-search ;; test larger `case' dispatches to trigger for binary-search
;; and hash-table-based dispatch: ;; and hash-table-based dispatch:

View File

@ -222,11 +222,14 @@ transcript.
(define no-extra-if-tests? #f) (define no-extra-if-tests? #f)
(define (syntax-test expr) (define (syntax-test expr [rx #f])
(error-test expr exn:fail:syntax?) (error-test expr exn:fail:syntax?)
(unless no-extra-if-tests? (unless no-extra-if-tests?
(error-test (datum->syntax expr `(if #f ,expr (void)) expr) (error-test (datum->syntax expr `(if #f ,expr (void)) expr)
exn:fail:syntax?))) (lambda (x)
(and (exn:fail:syntax? x)
(or (not rx)
(regexp-match? rx (exn-message x))))))))
(define arity-test (define arity-test
(case-lambda (case-lambda