walker:macroexpand-all and tagbody

Description

There are two problems caused by the walker not treating forms in the tagbody correctly.

  1. walker:macroexpand-all expands symbols that have a symbol-macro definition in tagbody when they are in the tag position.
  2. walker:macroexpand-all doesn't "protect" macroexpansion of the macros in tagbody that can be a tag (symbols and integers).

To Reproduce

(walker:macroexpand-all
 '(symbol-macrolet ((tag (tag-expanded)))
   (tagbody tag)))
; => (SYMBOL-MACROLET ((TAG (TAG-EXPANDED)))
;      (TAGBODY (TAG-EXPANDED)))

(defmacro not-tag () 'tag-expanded)
(walker:macroexpand-all '(tagbody (not-tag)))
; => (TAGBODY TAG-EXPANDED)

Expected behavior

The determination of which elements of the body are tags and which are statements is made prior to any macro expansion of that element. If a statement is a macro form and its macro expansion is an atom, that atom is treated as a statement, not a tag.

-- CLHS, tagbody: https://www.lispworks.com/documentation/HyperSpec/Body/s_tagbod.htm

That means that

  1. tag in tagbody should not be expanded.
  2. (not-tag) expansion should be "protected" so that it doesn't become a tag, for example via progn.

ECL version

Provide details regarding ECL version (or preferably commit), operating system and if revelant the build options and versions of the build tools.

(format t "~&~@{~12@A ~S~%~}"
        :version (lisp-implementation-version)
        :vcs-id (ext:lisp-implementation-vcs-id)
        :os (software-type)
        :os-version (software-version)
        :machine-type (machine-type)
        :features *features*)
     VERSION "24.5.10"
      VCS-ID "UNKNOWN"
          OS "Linux"
  OS-VERSION "6.2.0-39-generic"
MACHINE-TYPE "x86_64"
    FEATURES (:WALKER :CDR-6 :GRAY-STREAMS-MODULE :CDR-1 :CDR-5 :LINUX
              :FORMATTER :CDR-7 :ECL-WEAK-HASH :LITTLE-ENDIAN
              :ECL-READ-WRITE-LOCK :LONG-LONG :UINT64-T :UINT32-T :UINT16-T
              :COMPLEX-FLOAT :LONG-FLOAT :UNICODE :DFFI :CLOS-STREAMS
              :CMU-FORMAT :UNIX :ECL-PDE :DLOPEN :CLOS :THREADS :BOEHM-GC
              :ANSI-CL :COMMON-LISP :FLOATING-POINT-EXCEPTIONS
              :IEEE-FLOATING-POINT :PACKAGE-LOCAL-NICKNAMES :CDR-14
              :PREFIXED-API :FFI :X86_64 :COMMON :ECL)

Additional information

This affects quite a few other implementations, see this table (two last columns): https://plaster.tymoon.eu/view/4637.