Hi! I haven't been able to make a reproducer for this, but for illustrativepurposes, here is a code snippet that fails with -O2 on Guile 3.0.5 andlater (excerpt from GNU Shepherd): (define (run-command socket-file action service args) "Perform ACTION with ARGS on SERVICE, and display the result. Connect to the daemon via SOCKET-FILE." (with-system-error-handling (let ((sock (open-connection socket-file)) (action* (if (and (eq? action 'detailed-status) (memq service '(root shepherd))) 'status action))) ;; Send the command. (write-command (shepherd-command action* service #:arguments args) sock) https://git.savannah.gnu.org/cgit/shepherd.git/tree/modules/shepherd/scripts/herd.scm#n124 At -O2, (eq? action 'detailed-status) evaluates to true no matter whatsymbol ACTION holds. Interestingly, adding (pk action*) between LET and WRITE-COMMAND givesthe expected result and mitigates the problem(!). There are other issues that can be observed by running the Shepherd testsuite (i.e. make -j4 check). With -O1 all pass.
Re: bug#47172: Shepherd 0.8.1 tests fail on core-updates
(address . email@example.com)
Ludovic Courtès <firstname.lastname@example.org> skriver:
Toggle quote (36 lines)> Ludovic Courtès <email@example.com> skribis:>>> This turns out to be due to a… miscompilation bug.>>>> In (shepherd scripts herd), ‘run-command’ has this code:>>>> (let ((sock (open-connection socket-file))>> (action* (if (and (eq? action 'detailed-status)>> (memq service '(root shepherd)))>> 'status>> action)))>> …)>>>> Problem is that everything works as if (eq? action 'detailed-status)>> was omitted, such that ‘herd stop root’ is interpreted as ‘herd status>> root’.>> A workaround that works with 3.0.7 is swapping the two ‘and’> sub-expressions:>> diff --git a/modules/shepherd/scripts/herd.scm b/modules/shepherd/scripts/herd.scm> index 106de1e..39d2e34 100644> --- a/modules/shepherd/scripts/herd.scm> +++ b/modules/shepherd/scripts/herd.scm> @@ -126,8 +126,8 @@ of pairs."> the daemon via SOCKET-FILE."> (with-system-error-handling> (let ((sock (open-connection socket-file))> - (action* (if (and (eq? action 'detailed-status)> - (memq service '(root shepherd)))> + (action* (if (and (memq service '(root shepherd))> + (eq? action 'detailed-status))> 'status> action)))> ;; Send the command.
Cc'ing the relevant Guile bug: https://bugs.gnu.org/48368 See also commit 79be6a985799adc6d663890250f4fb7c12f015b4 on'core-updates' that builds with -O1 as a less satisfactory workaround.