~ chicken-core (chicken-5) 8fdfb877d30433bf61b39427a84cd9cd11b4ec86
commit 8fdfb877d30433bf61b39427a84cd9cd11b4ec86 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Mon Aug 29 04:27:23 2011 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Mon Aug 29 04:27:23 2011 +0200 ignore and report notice on named declarations of local vars diff --git a/compiler.scm b/compiler.scm index 0ac5a0f7..91dc28ab 100644 --- a/compiler.scm +++ b/compiler.scm @@ -1140,7 +1140,10 @@ (walk `(##core#begin ,@(map (lambda (d) - (process-declaration d se)) + (process-declaration + d se + (lambda (id) + (memq (lookup id se) e)))) (cdr x) ) ) e '() #f #f h) ) @@ -1290,7 +1293,7 @@ '() (##sys#current-environment) #f #f #f) ) ) -(define (process-declaration spec se) +(define (process-declaration spec se local?) (define (check-decl spec minlen . maxlen) (let ([n (length (cdr spec))]) (if (or (< n minlen) (> n (optional maxlen 99999))) @@ -1300,7 +1303,17 @@ (define (strip x) ; raw symbol (##sys#strip-syntax x)) (define stripu ##sys#strip-syntax) - (define (globalize-all syms) (map (cut ##sys#globalize <> se) syms)) + (define (globalize-all syms) + (filter-map + (lambda (var) + (cond ((local? var) + (note-local var) + #f) + (else (##sys#globalize var se)))) + syms)) + (define (note-local var) + (##sys#notice + (sprintf "ignoring declaration for locally bound variable `~a'" var))) (call-with-current-continuation (lambda (return) (unless (pair? spec) @@ -1504,30 +1517,32 @@ (warning "illegal type declaration" (##sys#strip-syntax spec)) (let ((name (##sys#globalize (car spec) se)) (type (##sys#strip-syntax (cadr spec)))) - (let-values (((type pred pure) (validate-type type name))) - (cond (type - ;; HACK: since `:' doesn't have access to the SE, we - ;; fixup the procedure name if type is a named procedure type - ;; (We only have access to the SE for ##sys#globalize in here). - ;; Quite terrible. - (when (and (pair? type) - (eq? 'procedure (car type)) - (symbol? (cadr type))) - (set-car! (cdr type) name)) - (mark-variable name '##compiler#type type) - (mark-variable name '##compiler#declared-type) - (when pure - (mark-variable name '##compiler#pure #t)) - (when pred - (mark-variable name '##compiler#predicate pred)) - (when (pair? (cddr spec)) - (install-specializations - name - (##sys#strip-syntax (cddr spec))))) - (else - (warning - "illegal `type' declaration" - (##sys#strip-syntax spec)))))))) + (if (local? (car spec)) + (note-local (car spec)) + (let-values (((type pred pure) (validate-type type name))) + (cond (type + ;; HACK: since `:' doesn't have access to the SE, we + ;; fixup the procedure name if type is a named procedure type + ;; (We only have access to the SE for ##sys#globalize in here). + ;; Quite terrible. + (when (and (pair? type) + (eq? 'procedure (car type)) + (symbol? (cadr type))) + (set-car! (cdr type) name)) + (mark-variable name '##compiler#type type) + (mark-variable name '##compiler#declared-type) + (when pure + (mark-variable name '##compiler#pure #t)) + (when pred + (mark-variable name '##compiler#predicate pred)) + (when (pair? (cddr spec)) + (install-specializations + name + (##sys#strip-syntax (cddr spec))))) + (else + (warning + "illegal `type' declaration" + (##sys#strip-syntax spec))))))))) (cdr spec))) ((predicate) (for-each @@ -1535,13 +1550,15 @@ (cond ((and (list? spec) (symbol? (car spec)) (= 2 (length spec))) (let ((name (##sys#globalize (car spec) se)) (type (##sys#strip-syntax (cadr spec)))) - (let-values (((type pred pure) (validate-type type name))) - (if (and type (not pred)) - (mark-variable name '##compiler#predicate type) - (warning "illegal `predicate' declaration" spec))))) + (if (local? (car spec)) + (note-local (car spec)) + (let-values (((type pred pure) (validate-type type name))) + (if (and type (not pred)) + (mark-variable name '##compiler#predicate type) + (warning "illegal `predicate' declaration" spec)))))) (else (warning "illegal `type' declaration item" spec)))) - (globalize-all (cdr spec)))) + (cdr spec))) ((specialize) (set! enable-specialization #t)) ((strict-types)Trap