Fix compile time type-mismatch in the expansion of (setf schar)
commit1ac88e72db13e6586b8ceebff468b1fa108178cb
authorStas Boukarev <stassats@gmail.com>
Sat, 4 Mar 2017 22:52:40 +0000 (5 01:52 +0300)
committerStas Boukarev <stassats@gmail.com>
Sat, 4 Mar 2017 23:00:37 +0000 (5 02:00 +0300)
tree76ea704ce739762380923eaee10e1157efa0e918
parent971fa312bd7bf3e1d3581cd3ad315ad19f95a8fd
Fix compile time type-mismatch in the expansion of (setf schar)

It expands into an etypecase for character and base-char strings, and
when the value is known to be an extended-char it would produce a
compile-time warning.

Introduce a new special form, (the* (type &key context
silent-conflict) value), when ir1-optimize encounters a cast with
silent-conflict t and there's a type conflict it will convert it to an
internal error instead of %compile-time-type-error.

The new special form is needed because
(if (base-char-p x) (setf aref) (type-error))
doesn't take SAFETY into account. And it actually replaces
THE-CONTEXT.

Fixes lp#1668619
13 files changed:
package-data-list.lisp-expr
src/code/array.lisp
src/code/defstruct.lisp
src/code/numbers.lisp
src/compiler/checkgen.lisp
src/compiler/generic/vm-tran.lisp
src/compiler/ir1-translators.lisp
src/compiler/ir1opt.lisp
src/compiler/node.lisp
src/compiler/parse-lambda-list.lisp
src/pcl/walk.lisp
tests/compiler.pure.lisp
tests/macroexpand.impure.lisp