Eric Blake <ebb9 <at> byu.net> writes: > Sorry for committing before the testsuite completed. It turns out that > this introduced a regression in 'make check TESTSUITEFLAGS="-k > AC_RUN_IFELSE"', due to the following: > > $ if false; then :; else echo $?; fi > 1
In the process of trying to work around this, I discovered a bug in zsh 4.3.9: $ zsh -c 'emulate sh; false; $empty; echo $?' 1 All other shells that I tried obey this POSIX rule [1]: "If there is no command name,... the command shall complete with a zero exit status." and correctly echo 0. [1] http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_0 9_01 > But adding the : after the else, we have effectively made it impossible > for the user to grab $? after the if condition, so I'll have to rethink > this patch. Various things I've tried - the idea here is to replace 'echo $?' with anything else the user might have supplied, including an m4 macro that expands to the empty string: if false; then :; else $empty echo $?; fi This fails to preserve status, except on zsh where it triggered the shell bug mentioned above. if false; then :; else $empty echo $?; fi For simple commands, this works fine. But it inhibits recognition of the word after $empty as a keyword, causing syntax errors if you try to insert a compound command instead of 'echo $?'. nop() { return; } if false; then :; else nop echo $?; fi preserves $? on compliant shells. But this fails on older ash and on Solaris ksh (but surprisingly passed on Solaris /bin/sh). A slight tweak: nop() { return $?; } if false; then :; else nop echo $?; fi and Solaris ksh is happy, but ash still fails. nop() { return $1; } if false; then :; else nop $? echo $?; fi correctly preserves the exit status for all shells I have access to, but it sure adds a lot of characters. On the other hand, the definition for that nop matches as_fn_set_status, which m4sh is already using. So, would we rather write: m4_define([_AS_IF_ELSE], [m4_ifnblank([$1], [else as_fn_set_status $? $1 ])]) or revert today's patch to the simpler m4_define([_AS_IF_ELSE], [m4_ifnblank([$1], [else $1 ])]) which puts the burden back on the user, where calling: AS_IF([false], [], [AC_REQUIRE(...)]) causes a syntax error. If I could get AC_REQUIRE to play nicely with m4_expand, then that would be the solution - pre-expand the user's text, at which point we then know for certain whether the expansion is empty. But right now, I don't know how to pull that trick off. -- Eric Blake