+(defun process-decls (decls vars fvars &key (lexenv *lexenv*)
+ (binding-form-p nil))
+ (declare (list decls vars fvars))
+ (let ((result-type *wild-type*)
+ (*post-binding-variable-lexenv* nil))
+ (dolist (decl decls)
+ (dolist (spec (rest decl))
+ (unless (consp spec)
+ (compiler-error "malformed declaration specifier ~S in ~S" spec decl))
+ (multiple-value-bind (new-env new-result-type)
+ (process-1-decl spec lexenv vars fvars binding-form-p)
+ (setq lexenv new-env)
+ (unless (eq new-result-type *wild-type*)
+ (setq result-type
+ (values-type-intersection result-type new-result-type))))))
+ (values lexenv result-type *post-binding-variable-lexenv*)))
+
+(defun %processing-decls (decls vars fvars ctran lvar binding-form-p fun)
+ (multiple-value-bind (*lexenv* result-type post-binding-lexenv)
+ (process-decls decls vars fvars :binding-form-p binding-form-p)
+ (cond ((eq result-type *wild-type*)
+ (funcall fun ctran lvar post-binding-lexenv))
+ (t
+ (let ((value-ctran (make-ctran))
+ (value-lvar (make-lvar)))
+ (multiple-value-prog1
+ (funcall fun value-ctran value-lvar post-binding-lexenv)
+ (let ((cast (make-cast value-lvar result-type
+ (lexenv-policy *lexenv*))))
+ (link-node-to-previous-ctran cast value-ctran)
+ (setf (lvar-dest value-lvar) cast)
+ (use-continuation cast ctran lvar))))))))
+(defmacro processing-decls ((decls vars fvars ctran lvar
+ &optional post-binding-lexenv)
+ &body forms)
+ (check-type ctran symbol)
+ (check-type lvar symbol)
+ (let ((post-binding-lexenv-p (not (null post-binding-lexenv)))
+ (post-binding-lexenv (or post-binding-lexenv (gensym))))
+ `(%processing-decls ,decls ,vars ,fvars ,ctran ,lvar
+ ,post-binding-lexenv-p
+ (lambda (,ctran ,lvar ,post-binding-lexenv)
+ (declare (ignorable ,post-binding-lexenv))
+ ,@forms))))