THAW branch: The value #<SB-C::OPTIONAL-DISPATCH ...> is not of type SB-C::CLAMBDA when binding SB-C::NEW-FUN

Bug #1794211 reported by Paul F. Dietz
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
SBCL
Fix Released
Undecided
Unassigned

Bug Description

This was found on SB's thaw branch, which he asked me to test. The failure occurred quickly in random testing (within 50K iterations).

(defun f313 (b c)
  (flet ((%f (&key (k 0))
            (return-from %f
               (flet ((%g (x y &optional (z b)) z))
                 (%g (%g 0 c) 0 0))))))
  0)

==>

The value
  #<SB-C::OPTIONAL-DISPATCH
    :%SOURCE-NAME %G
    :%DEBUG-NAME #1=(FLET %G :IN F313)
    :TYPE #2=#<SB-KERNEL:BUILT-IN-CLASSOID FUNCTION (read-only)>
    :WHERE-FROM :DEFINED
    :ARGLIST (#<SB-C::LAMBDA-VAR :%SOURCE-NAME X {1005043DE3}>
              #<SB-C::LAMBDA-VAR :%SOURCE-NAME Y {1005043EA3}>
              #<SB-C::LAMBDA-VAR
                :%SOURCE-NAME Z
                :ARG-INFO #<SB-C::ARG-INFO
                            :KIND :OPTIONAL
                            :DEFAULT B {1005044043}> {1005043F63}>)
    :ALLOWP NIL
    :KEYP NIL
    :MIN-ARGS 2
    :MAX-ARGS 3
    :ENTRY-POINTS (#<SB-C::CLAMBDA
                     :%SOURCE-NAME SB-C::.ANONYMOUS.
                     :%DEBUG-NAME (SB-C::&OPTIONAL-PROCESSOR
                                   (FLET %G :IN F313))
                     :KIND NIL
                     :TYPE #2#
                     :WHERE-FROM :DEFINED
                     :VARS (X Y) {1005045073}>
                   #3=#<SB-C::CLAMBDA
                        :%SOURCE-NAME %G
                        :%DEBUG-NAME #1#
                        :KIND :OPTIONAL
                        :TYPE #2#
                        :WHERE-FROM :DEFINED
                        :VARS (X Y Z) {1005044353}>)
    :MAIN-ENTRY #3# {1005044133}>

is not of type
  SB-C::CLAMBDA
when binding SB-C::NEW-FUN
   [Condition of type TYPE-ERROR]

Restarts:
 0: [ABORT] Exit debugger, returning to top level.

Backtrace:
  0: (SB-C::MERGE-TAIL-SETS #<SB-C::COMBINATION :FUN #<SB-C::REF :LEAF #<SB-C::OPTIONAL-DISPATCH :%SOURCE-NAME %G :%DEBUG-NAME # :TYPE #<SB-KERNEL:BUILT-IN-CLASSOID FUNCTION (read-only)> :WHERE-FROM :DEFI..
  1: (SB-C::DELETE-FILTER #<SB-EXT:EXIT :ENTRY #<SB-C::ENTRY {10050438C3}> :VALUE #<SB-C::LVAR 1 {1005043A53}> {1005043AB3}> #<SB-C::LVAR 2 {1005042DB3}> #<SB-C::LVAR 1 {1005043A53}>)
  2: (SB-C::MERGE-LETS #<SB-C::CLAMBDA :%SOURCE-NAME SB-C::.ANONYMOUS. :%DEBUG-NAME (SB-C::&OPTIONAL-PROCESSOR (FLET %G :IN F313)) :KIND NIL :TYPE #<SB-KERNEL:BUILT-IN-CLASSOID FUNCTION (read-only)> :WHERE..
  3: (SB-C::LET-CONVERT #<SB-C::CLAMBDA :%SOURCE-NAME SB-C::.ANONYMOUS. :%DEBUG-NAME (SB-C::&OPTIONAL-PROCESSOR (FLET %G :IN F313)) :KIND NIL :TYPE #<SB-KERNEL:BUILT-IN-CLASSOID FUNCTION (read-only)> :WHER..
  4: (SB-C::MAYBE-LET-CONVERT #<SB-C::CLAMBDA :%SOURCE-NAME SB-C::.ANONYMOUS. :%DEBUG-NAME (SB-C::&OPTIONAL-PROCESSOR (FLET %G :IN F313)) :KIND NIL :TYPE #<SB-KERNEL:BUILT-IN-CLASSOID FUNCTION (read-only)>..
  5: ((FLET SB-C::FROB :IN SB-C::DELETE-OPTIONAL-DISPATCH) #<SB-C::CLAMBDA :%SOURCE-NAME SB-C::.ANONYMOUS. :%DEBUG-NAME (SB-C::&OPTIONAL-PROCESSOR (FLET %G :IN F313)) :KIND NIL :TYPE #<SB-KERNEL:BUILT-IN-C..
  6: (SB-C::DELETE-OPTIONAL-DISPATCH #<SB-C::OPTIONAL-DISPATCH :%SOURCE-NAME %G :%DEBUG-NAME #1=(FLET %G :IN F313) :TYPE #2=#<SB-KERNEL:BUILT-IN-CLASSOID FUNCTION (read-only)> :WHERE-FROM :DEFINED :ARGLIST..

[...]

Revision history for this message
Paul F. Dietz (paul-f-dietz) wrote :

Additional lambda forms that showed the bug (not hand reduced):

   (LAMBDA (A B)
     (DECLARE (TYPE (INTEGER -2124124 105032712075782512) A))
     (DECLARE (TYPE (INTEGER -635 190) B))
     (DECLARE (IGNORABLE A B))
     (DECLARE
      (OPTIMIZE (DEBUG 2) (SPEED 0) (SAFETY 0) (SPACE 3)
       (SB-C:INSERT-STEP-CONDITIONS 0) (COMPILATION-SPEED 0)))
     (LET ((*S6* 0))
       (LET ((*S2*
              (LABELS ((%F4 (&OPTIONAL (F4-1 0) &KEY &ALLOW-OTHER-KEYS)
                         (FLET ((%F15 (F15-1 F15-2 F15-3)
                                  (FLET ((%F15 (F15-1 F15-2 F15-3)
                                           (PROGV
                                               '(*S8* *S9*)
                                               (LIST 0 0)
                                             (FLET ((%F14
                                                        (F14-1 F14-2 F14-3
                                                         &OPTIONAL
                                                         (F14-4 F15-2)
                                                         (F14-5 0) (F14-6 B)
                                                         &KEY (KEY1 0) (KEY2 0))
                                                      F14-3))
                                               (%F14 0 0
                                                (%F14 0 0 (%F14 0 0 0) 0) 0
                                                0)))))
                                    (LET ((*S6* (%F15 0 0 *S6*)))
                                      0))))
                           (%F15 F4-1 0 B))))
                B)))
         0)))

and

   (LAMBDA (A B)
     (DECLARE (TYPE (INTEGER -521801 534917) A))
     (DECLARE (TYPE (INTEGER 4126244932124 6604041512606) B))
     (DECLARE (IGNORABLE A B))
     (DECLARE
      (OPTIMIZE (SB-C:INSERT-STEP-CONDITIONS 0) (DEBUG 1) (SPACE 0) (SPEED 1)
       (COMPILATION-SPEED 2) (SAFETY 3)))
     (FLET ((%F14 (F14-1 F14-2 F14-3 &KEY)
              (RETURN-FROM %F14
                (RETURN-FROM %F14
                  (RETURN-FROM %F14
                    (PROGV
                        '(*S2* *S9* *S3*)
                        (LIST 0 A 0)
                      (LABELS ((%F6 (F6-1 &OPTIONAL (F6-2 F14-1))
                                 F14-2))
                        (%F6 0 (%F6 F14-1)))))))))
       0))

(where the *...* variables are declaimed special.)

description: updated
Revision history for this message
Paul F. Dietz (paul-f-dietz) wrote :

Another simple one:

(defun f314 (a b)
  (unwind-protect
      (flet ((%f4 (f4-1 f4-2 f4-3 &optional (f4-4 b) (f4-5 0) (f4-6 b) &key)
               0))
        (%f4 a 0 b 0 0 (%f4 a 0 0)))))

Revision history for this message
Stas Boukarev (stassats) wrote :

Thanks. Try again, from the same branch.

Changed in sbcl:
status: New → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.