Subject: Re: bug#76573: 30.1; native compilation fails for record inside function

From: Andrea Corallo <[email-masked]>
Date: Mon, 31 Mar 2025 11:06:13 -0400

Lin Jian <[email-masked]> writes:

> Run the following shell command and you see the error.
>
>> emacs -Q --batch --eval="(native-compile (defun foo-f () (record 'foo-r)))"
> Error: error (foo-f "Type foo-r missing from typeof-types!")
>   signal(error (foo-f "Type foo-r missing from typeof-types!"))
>   comp--native-compile(foo-f nil nil)
>   native-compile(foo-f)
>   eval((native-compile (defun foo-f nil (record 'foo-r))) t)
>   command-line-1(("--eval=(native-compile (defun foo-f () (record 'foo-r)))"))
>   command-line()
>   normal-top-level()
> peculiar error: "Type foo-r missing from typeof-types!"
>
> If you set `native-comp-speed' to -1, 0 or 1, there is no error.
>> emacs -Q --batch --eval="(setopt native-comp-speed 1)"
>> --eval="(native-compile (defun foo-f () (record 'foo-r)))"
>
> Emacs 30.0.93 and 30.1 have this bug, while Emacs 29.4 does not.
>
> Real world elisp packages triggering this bug are emacs-aio[1] and
> el-easydraw[2].
>
> [1]: https://github.com/skeeto/emacs-aio/issues/31
> [2]: https://github.com/misohena/el-easydraw/blob/f6b0f43138693b73cb65327d28bd2a4ee1b6caa7/edraw-path.el

Hi Lin,

the compiler is complaining because while the code is trying to create
an object of type 'foo-r', this was actually never defined.

Typically those user defined objects are defined using higher level
constructs like 'cl-defstruct' which takes care of registering the
definition into the global state (and defining the creator
'make-foo-r').

Why is this code trying to create never defined kind of objects?  Isn't
the case that the code in the file being compiled is missing some
require to the definition?

  Andrea