Now that I think of it, in addition to my patch not being as robust as it should be, there are a lot of other places that need to check (and (consp (cdr ...))) before checking (not (cddr ...)), or somesuch.  To what extent is the compiler is expected to be resilient against these?

* (compile nil '(lambda (x) (funcall (function . foo) x))) ; crash in find-compiler-macro
* (compile nil '(lambda (x) (declare (ftype (function . bad) foo)))) ; crash in %last1, ultimately due to careful-specifier-type [and I thought it was careful!]
* (compile nil '(lambda (x) (declare (special . fred)))) ; crash in process-special-decl
* (compile nil '(lambda (x) (declare (ignore . fred)))) ; crash in process-ignore-decl
* (compile nil '(lambda (x) (declare (special (foo))))) ; crash in find-in-bindings
* (compile nil '(lambda (x) (declare (ignore 3)))) ; crash in find-in-bindings
and relatedly but not exactly the same:
* (compile nil '(lambda (x) (declare (special 3)))) ; crash in symbol-assert-home-package-unlocked