numericals icon indicating copy to clipboard operation
numericals copied to clipboard

Weird type error when `sum` a displaced array

Open kchanqvq opened this issue 1 year ago • 3 comments

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?

kchanqvq avatar Dec 28 '24 05:12 kchanqvq

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.

digikar99 avatar Dec 28 '24 06:12 digikar99

I can also reproduce this on CCL, so this should not have anything to do with SBCL.

digikar99 avatar Dec 28 '24 10:12 digikar99

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.

digikar99 avatar Dec 28 '24 11:12 digikar99