bug#81514: 32.0.50; Eglot messages progress reporter shows errors

Stéphane Marks <[email protected]> Wed, 29 Jul 2026 20:47:34 +0200
Newsgroups gmane.emacs.bugs
Message-ID <CAN+1Hbp0bi1bxBWyHu6Jha8i6ELox6dPgQ8sadhNErSEwHjZ7A@mail.gmail.com>
On Wed, Jul 29, 2026 at 11:17 AM Jacek Świerk <[email protected]> wrote:

> I can reproduce it with clangd on the following C++ repository:
> https://github.com/rui314/mold. It doesn't happen every time but often
> enough:
>
> Debugger entered--Lisp error: (wrong-type-argument sequencep 100)
>   ((20 . [1785337541.907988 nil nil "[eglot] mold backgroundIndexProgress:
> indexing..." 1 0.2 nil nil]) 20 100)
>   progress-reporter-do-update((20 . [1785337541.907988 nil nil "[eglot]
> mold backgroundIndexProgress: indexing..." 1 0.2 nil nil]) 100 nil)
>   eglot--reporter-update((20 . [1785337541.907988 nil nil "[eglot] mold
> backgroundIndexProgress: indexing..." 1 0.2 nil nil]) 100 nil)
>   #f(compiled-function (arg1 arg2 arg3 arg4 &rest rest) #<bytecode
> 0xa1216d65848076a>)(#<eglot-lsp-server 1022b7360904>
> "backgroundIndexProgress" 100 nil)
>   #f(compiled-function (arg1 arg2 &rest rest) "Handle $/progress
> notification identified by TOKEN from SERVER." #<bytecode
> -0xf68beacb9f43862>)(#<eglot-lsp-server 1022b7360904> $/progress :token
> "backgroundIndexProgress" :value (:kind "end"))
>   apply(#f(compiled-function (arg1 arg2 &rest rest) "Handle $/progress
> notification identified by TOKEN from SERVER." #<bytecode
> -0xf68beacb9f43862>) #<eglot-lsp-server 1022b7360904> $/progress (:token
> "backgroundIndexProgress" :value (:kind "end")))
>   eglot-handle-notification(#<eglot-lsp-server 1022b7360904> $/progress
> :token "backgroundIndexProgress" :value (:kind "end"))
>   apply(eglot-handle-notification #<eglot-lsp-server 1022b7360904>
> $/progress (:token "backgroundIndexProgress" :value (:kind "end")))
>   #f(compiled-function (server method params) #<bytecode
> 0x1f1b657efb0838aa>)(#<eglot-lsp-server 1022b7360904> $/progress (:token
> "backgroundIndexProgress" :value (:kind "end")))
>   jsonrpc-connection-receive(#<eglot-lsp-server 1022b7360904> (:jsonrpc
> "2.0" :method "$/progress" :params (:token "backgroundIndexProgress" :value
> (:kind "end"))))
>   #f(compiled-function (conn msg) #<bytecode
> 0x4e6153735258fd3>)(#<eglot-lsp-server 1022b7360904> (:jsonrpc "2.0"
> :method "$/progress" :params (:token "backgroundIndexProgress" :value
> (:kind "end"))))
>   apply(#f(compiled-function (conn msg) #<bytecode 0x4e6153735258fd3>)
> (#<eglot-lsp-server 1022b7360904> (:jsonrpc "2.0" :method "$/progress"
> :params (:token "backgroundIndexProgress" :value (:kind "end")))))
>   timer-event-handler([t 27242 5829 902968 nil #f(compiled-function (conn
> msg) #<bytecode 0x4e6153735258fd3>) (#<eglot-lsp-server 1022b7360904>
> (:jsonrpc "2.0" :method "$/progress" :params (:token
> "backgroundIndexProgress" :value (:kind "end")))) nil 894000 nil])
>
> The LSP message that causes it looks like this from the
> (eglot-events-buffer):
> <-- $/progress
> {"jsonrpc":"2.0","method":"$/progress","params":{"token":"backgroundIndexProgress","value":{"kind":"end"}}}
>
> Based on my understanding of Eglot code, Eglot creates a non-numeric
> progress
> reporter because MIN-VALUE and MAX-VALUE arguments are not provided.
> However, it
> looks like Eglot updates the created progress reporter as it were numeric:
> (eglot--reporter-update pr pcnt msg)
>
> For the {"kind": "end"} notification, pcnt is set to 100 and msg is nil.
> After
> commit b6849229003, the pulsing reporter forwards (or update-text value) as
> UPDATE-TEXT. That evaluates to 100. Then progress-reporter-echo-area tries
> (concat (if update-text " " "") update-text) which triggers the shown
> error.
>
I was able to reproduce the issue without eglot and will take a look.

Coincidentally, and independent of the issue, eglot seems to want a numeric
reporter but instead creates a non-numeric reporter.  eglot-handle-notification
method seems to also be missing the call to progress-reporter-done that
would clear any stateful reporters it's created such as those in
system-taskbar for which a relevant change was made in Tramp recently.  I
can take a stab at those.