Weird type error when `sum` a displaced array
The following gives error for me (on SBCL 2.4.11):
(sum (aref* (zeros '(2 10))
(list 0) (list 3))
:axes 1)
The error is
No applicable POLYMORPH discovered for polymorphic-function
ARRAY-ELEMENT-TYPE
and ARGS:
(NIL)
derived to be of TYPES:
(NULL)
Available Effective-Type-Lists include:
(COMMON-LISP:ARRAY)
(ABSTRACT-ARRAYS:ABSTRACT-ARRAY)
[Condition of type PELTADOT/POLYMORPHIC-FUNCTIONS::NO-APPLICABLE-POLYMORPH/ERROR]
Showing the source of the stack frame gives:
(LAMBDA ()
(PELTADOT/POLYMORPHIC-FUNCTIONS::LIST-NAMED-EXLAMBDA (PELTADOT/POLYMORPHIC-FUNCTIONS:POLYMORPHIC-FUNCTION
SUM)
#<PACKAGE "DENSE-NUMERICALS/BASIC-MATH">
(DENSE-NUMERICALS/BASIC-MATH/IMPL::ARRAY-LIKE &REST #:ARGS1657 &KEY
(DENSE-NUMERICALS/BASIC-MATH/IMPL::AXES NIL #:AXES1658)
(DENSE-NUMERICALS/BASIC-MATH/IMPL::KEEP-DIMS NIL #:KEEP-DIMS1659)
(DENSE-NUMERICALS/BASIC-MATH/IMPL::OUT NIL #:OUT1660))
(DECLARE (OPTIMIZE DEBUG))
(DECLARE
(IGNORABLE DENSE-NUMERICALS/BASIC-MATH/IMPL::AXES
DENSE-NUMERICALS/BASIC-MATH/IMPL::KEEP-DIMS
DENSE-NUMERICALS/BASIC-MATH/IMPL::OUT #:AXES1658 #:KEEP-DIMS1659
#:OUT1660)
(DYNAMIC-EXTENT #:ARGS1657)
(OPTIMIZE COMPILATION-SPEED))
(BLOCK SUM
(APPLY
(THE FUNCTION
(PELTADOT/CL:LOCALLY
(DECLARE (SB-EXT:MUFFLE-CONDITIONS SB-EXT:COMPILER-NOTE)
(COMPILER-MACRO-NOTES:MUFFLE
COMPILER-MACRO-NOTES:OPTIMIZATION-FAILURE-NOTE))
(COND
((AND T
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::OUT
'(SIMPLE-ARRAY COMMON-LISP:*))
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::KEEP-DIMS 'BOOLEAN)
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::AXES 'INTEGER)
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::ARRAY-LIKE
'(SIMPLE-ARRAY COMMON-LISP:*))
(AND
(EQUAL
(#:***HERE***
(ARRAY-ELEMENT-TYPE
DENSE-NUMERICALS/BASIC-MATH/IMPL::OUT))
(ARRAY-ELEMENT-TYPE
DENSE-NUMERICALS/BASIC-MATH/IMPL::ARRAY-LIKE))))
#'PELTADOT/POLYMORPHIC-FUNCTIONS/NONUSER::|(PELTADOT/POLYMORPHIC-FUNCTIONS:POLYMORPH DENSE-NUMERICALS/BASIC-MATH:SUM
((DENSE-ARRAYS:SIMPLE-ARRAY DENSE-NUMERICALS/BASIC-MATH/IMPL::<TYPE>)
COMMON-LISP:&KEY (:AXES COMMON-LISP:INTEGER) (:KEEP-DIMS COMMON-LISP:BOOLEAN)
(:OUT (DENSE-ARRAYS:SIMPLE-ARRAY DENSE-NUMERICALS/BASIC-MATH/IMPL::<TYPE>))))|)
((AND T
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::OUT 'NULL)
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::KEEP-DIMS 'BOOLEAN)
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::AXES 'INTEGER)
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::ARRAY-LIKE
'(SIMPLE-ARRAY COMMON-LISP:*))
(AND))
#'PELTADOT/POLYMORPHIC-FUNCTIONS/NONUSER::|(PELTADOT/POLYMORPHIC-FUNCTIONS:POLYMORPH DENSE-NUMERICALS/BASIC-MATH:SUM
((DENSE-ARRAYS:SIMPLE-ARRAY DENSE-NUMERICALS/BASIC-MATH/IMPL::<TYPE>)
COMMON-LISP:&KEY (:AXES COMMON-LISP:INTEGER) (:KEEP-DIMS COMMON-LISP:BOOLEAN)
(:OUT COMMON-LISP:NULL)))|)
((AND T
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::OUT 'NULL)
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::KEEP-DIMS 'BOOLEAN)
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::AXES 'CONS)
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::ARRAY-LIKE
'(SIMPLE-ARRAY COMMON-LISP:*))
(AND))
#'PELTADOT/POLYMORPHIC-FUNCTIONS/NONUSER::|(PELTADOT/POLYMORPHIC-FUNCTIONS:POLYMORPH DENSE-NUMERICALS/BASIC-MATH:SUM
((DENSE-ARRAYS:SIMPLE-ARRAY DENSE-NUMERICALS/BASIC-MATH/IMPL::<TYPE>)
COMMON-LISP:&KEY (:AXES COMMON-LISP:CONS) (:KEEP-DIMS COMMON-LISP:BOOLEAN)
(:OUT COMMON-LISP:NULL)))|)
((AND T
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::OUT 'NULL)
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::KEEP-DIMS 'NULL)
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::AXES 'NULL)
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::ARRAY-LIKE
'(SIMPLE-ARRAY COMMON-LISP:*))
(AND))
#'PELTADOT/POLYMORPHIC-FUNCTIONS/NONUSER::|(PELTADOT/POLYMORPHIC-FUNCTIONS:POLYMORPH DENSE-NUMERICALS/BASIC-MATH:SUM
((DENSE-ARRAYS:SIMPLE-ARRAY DENSE-NUMERICALS/BASIC-MATH/IMPL::<TYPE>)
COMMON-LISP:&KEY (:AXES COMMON-LISP:NULL) (:KEEP-DIMS COMMON-LISP:NULL)
(:OUT COMMON-LISP:NULL)))|)
((AND T
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::OUT '(OR NULL T))
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::KEEP-DIMS '(OR NULL T))
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::AXES '(OR NULL T))
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::ARRAY-LIKE 'LIST))
#'PELTADOT/POLYMORPHIC-FUNCTIONS/NONUSER::|(PELTADOT/POLYMORPHIC-FUNCTIONS:POLYMORPH DENSE-NUMERICALS/BASIC-MATH:SUM
(COMMON-LISP:LIST COMMON-LISP:&KEY (:AXES COMMON-LISP:T)
(:KEEP-DIMS COMMON-LISP:T) (:OUT COMMON-LISP:T)))|)
((AND T
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::OUT 'NULL)
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::KEEP-DIMS 'NULL)
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::AXES 'NULL)
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::ARRAY-LIKE
'(ARRAY COMMON-LISP:*))
(AND))
#'PELTADOT/POLYMORPHIC-FUNCTIONS/NONUSER::|(PELTADOT/POLYMORPHIC-FUNCTIONS:POLYMORPH DENSE-NUMERICALS/BASIC-MATH:SUM
((DENSE-ARRAYS:ARRAY DENSE-NUMERICALS/BASIC-MATH/IMPL::<TYPE>)
COMMON-LISP:&KEY (:AXES COMMON-LISP:NULL) (:KEEP-DIMS COMMON-LISP:NULL)
(:OUT COMMON-LISP:NULL)))|)
((AND T
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::OUT 'NULL)
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::KEEP-DIMS '(NOT NULL))
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::AXES 'NULL)
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::ARRAY-LIKE
'(ARRAY COMMON-LISP:*))
(AND))
#'PELTADOT/POLYMORPHIC-FUNCTIONS/NONUSER::|(PELTADOT/POLYMORPHIC-FUNCTIONS:POLYMORPH DENSE-NUMERICALS/BASIC-MATH:SUM
((DENSE-ARRAYS:ARRAY DENSE-NUMERICALS/BASIC-MATH/IMPL::<TYPE>)
COMMON-LISP:&KEY (:AXES COMMON-LISP:NULL)
(:KEEP-DIMS (COMMON-LISP:NOT COMMON-LISP:NULL)) (:OUT COMMON-LISP:NULL)))|)
((AND T
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::OUT
'(OR NULL (ARRAY COMMON-LISP:*)))
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::KEEP-DIMS '(OR NULL T))
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::AXES 'INTEGER)
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::ARRAY-LIKE
'(ARRAY COMMON-LISP:*))
(AND
(EQUAL
(ARRAY-ELEMENT-TYPE
DENSE-NUMERICALS/BASIC-MATH/IMPL::OUT)
(ARRAY-ELEMENT-TYPE
DENSE-NUMERICALS/BASIC-MATH/IMPL::ARRAY-LIKE))))
#'PELTADOT/POLYMORPHIC-FUNCTIONS/NONUSER::|(PELTADOT/POLYMORPHIC-FUNCTIONS:POLYMORPH DENSE-NUMERICALS/BASIC-MATH:SUM
((DENSE-ARRAYS:ARRAY DENSE-NUMERICALS/BASIC-MATH/IMPL::<TYPE>)
COMMON-LISP:&KEY (:AXES COMMON-LISP:INTEGER) (:KEEP-DIMS COMMON-LISP:T)
(:OUT (DENSE-ARRAYS:ARRAY DENSE-NUMERICALS/BASIC-MATH/IMPL::<TYPE>))))|)
(T
(RETURN-FROM SUM
(FUNCALL
#<FUNCTION PELTADOT/POLYMORPHIC-FUNCTIONS:NO-APPLICABLE-POLYMORPH>
'SUM NIL
(LIST* DENSE-NUMERICALS/BASIC-MATH/IMPL::ARRAY-LIKE
#:ARGS1657)))))))
DENSE-NUMERICALS/BASIC-MATH/IMPL::ARRAY-LIKE #:ARGS1657))))
Looking at the (#:***HERE*** ...) form, apparently sum has called array-element-type on nil, which gives this error. However, this shouldn't have run at all! Look at the and form surrounding it -- the test
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::OUT
'(SIMPLE-ARRAY COMMON-LISP:*))
should have failed and code shouldn't reach (#:***HERE*** ...).
Can you reproduce this? Do you think this is an SBCL bug?
I can reproduce this on SBCL 2.4.5 as well for dense-numericals but not numericals.
I can rule out that this unexpected behavior occurs due to the compiler macro of pelatdot:typep. The behavior continues even if I comment out the compiler macro.
But removing the compiler macro of peltadot:typep results in useful behavior from (trace peltadot:typep). I can see that:
.
.
.
0: (PELTADOT/TYPES-CORE:TYPEP NIL (DENSE-ARRAYS:SIMPLE-ARRAY *))
0: TYPEP returned NIL
.
0: (PELTADOT/TYPES-CORE:TYPEP
#<DENSE-ARRAYS:STANDARD-DENSE-ARRAY NIL 2x7 T
(0 0 0 0 0 0 0)
(0 0 0 0 0 0 0)
{10187E5B33}>
(DENSE-ARRAYS:SIMPLE-ARRAY *))
0: TYPEP returned NIL
.
.
.
This indeed becomes mysterious then. If it were an SBCL bug, we'd need a minimal reproducible example.
I can also reproduce this on CCL, so this should not have anything to do with SBCL.
The SBCL bug might be that the error location is incorrect. The place that can produce this error will be the second last condition check involving:
((AND T
(PELTADOT/TYPES-CORE:TYPEP
DENSE-NUMERICALS/BASIC-MATH/IMPL::OUT
'(OR NULL (ARRAY COMMON-LISP:*)))
.
.
.
(AND
(EQUAL
(ARRAY-ELEMENT-TYPE
DENSE-NUMERICALS/BASIC-MATH/IMPL::OUT)
(ARRAY-ELEMENT-TYPE
DENSE-NUMERICALS/BASIC-MATH/IMPL::ARRAY-LIKE))))
I will fix this issue in sometime then.