diff --git a/s/cpvalid.ss b/s/cpvalid.ss index adc68c337e..c3dcdf60d0 100644 --- a/s/cpvalid.ss +++ b/s/cpvalid.ss @@ -194,25 +194,32 @@ (lambda (what maybe-src id p x) (if (and p (not (eq? (proxy-state p) 'protected))) (let ([valid-flag (prelex-info-valid-flag id)]) - (if valid-flag - (let ([name (prelex-name id)]) - (let ([mesg (format "attempt to ~a undefined variable ~~s" what)]) - (when (undefined-variable-warnings) - ($source-warning #f maybe-src #t (format "possible ~a" mesg) name)) - (if (prelex-referenced valid-flag) - (set-prelex-multiply-referenced! valid-flag #t) - (set-prelex-referenced! valid-flag #t)) - `(seq - (if (ref #f ,valid-flag) - (quote ,(void)) - (call ,(make-preinfo-call) ,(lookup-primref 2 '$source-violation) - (quote #f) - (quote ,maybe-src) - (quote #t) - (quote ,mesg) - (quote ,name))) - ,x))) - x)) + (cond + [valid-flag + (if (prelex-referenced valid-flag) + (set-prelex-multiply-referenced! valid-flag #t) + (set-prelex-referenced! valid-flag #t)) + (if (enable-error-source-expression) + (let ([name (prelex-name id)]) + (let ([mesg (format "attempt to ~a undefined variable ~~s" what)]) + (when (undefined-variable-warnings) + ($source-warning #f maybe-src #t (format "possible ~a" mesg) name)) + `(seq + (if (ref #f ,valid-flag) + (quote ,(void)) + (call ,(make-preinfo-call) ,(lookup-primref 2 '$source-violation) + (quote #f) + (quote ,maybe-src) + (quote #t) + (quote ,mesg) + (quote ,name))) + ,x))) + `(seq + (if (ref #f ,valid-flag) + (quote ,(void)) + (call ,(make-preinfo-call) ,(lookup-primref 2 '$unknown-undefined-violation))) + ,x))] + [else x])) x)))) ; wl = worklist diff --git a/s/exceptions.ss b/s/exceptions.ss index 819fea3bae..c1998059e8 100644 --- a/s/exceptions.ss +++ b/s/exceptions.ss @@ -706,6 +706,11 @@ TODO: (error-help #f who #f message #f (condition (make-undefined-violation) (make-syntax-violation id #f))))) + (set-who! $unknown-undefined-violation + (lambda () + (error-help #f who #f "undefined" #f + (make-undefined-violation)))) + (set-who! $lexical-error (case-lambda [(whoarg msg args port ir?) diff --git a/s/primdata.ss b/s/primdata.ss index 6ba8a7a55e..3d2a93442c 100644 --- a/s/primdata.ss +++ b/s/primdata.ss @@ -2311,6 +2311,7 @@ ($unbound-object [sig [() -> (ptr)]] [flags pure unrestricted mifoldable true]) ($uncprep [flags single-valued]) ; side-effects preinfo-sexpr, at least ($undefined-violation [flags abort-op]) + ($unknown-undefined-violation [flags abort-op]) ($untrace [flags single-valued]) ($unwrap-ftype-pointer [flags single-valued]) ($value [sig [(ptr) -> (ptr)]] [flags pure unrestricted discard cp02])