summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorZack Weinberg <zackw@panix.com>2020-11-15 13:56:18 -0500
committerZack Weinberg <zackw@panix.com>2020-11-15 14:16:16 -0500
commitfd633e92cb63f7bb592dcffd2f2871fa28ab189d (patch)
tree497c04f7446f90867b334b8adbb81e5e5d89f10c /tests
parent996f608165814d578bdcb0ab2f3382edb8918690 (diff)
downloadautoconf-fd633e92cb63f7bb592dcffd2f2871fa28ab189d.tar.gz
AS_IF: Handle else clause being empty after macro expansion (#110369)
AS_IF can emit a syntactically invalid shell if-then-else, if CONDITION then : # ... else fi when its IF-FALSE argument consists of macros that don’t produce any shell code. This was a documented limitation in AS_IF, but it’s a bad limitation to have, because macros that *used* to expand to shell commands might start expanding to nothing in future releases. For instance, this broke the libzmq configure script, which did AC_PROG_CC AX_CHECK_COMPILE_FLAG([-std=gnu11], [CFLAGS+=" -std=gnu11"], [AC_PROG_CC_C99]) Perfectly valid in 2.69, but in 2.70 AC_PROG_CC_C99 doesn’t produce any shell code and the script crashes. We had that limitation for good reason: we can’t just put ‘:’ at the beginning of the else-clause, like we do for the then-clause, because that would clobber $? and the IF-FALSE commands might want to inspect it. (This doesn’t matter for the then-clause, because $? is always zero at the beginning of a then-clause anyway.) The simplest and least inefficient shell construct I can find that works in this context is a shell function that does ‘return $?’. Due to awkward M4sh initialization ordering constraints (AS_IF gets used before we can safely use shell functions) an indirection through a shell variable is necessary. The structure of a m4sh script is now #! /bin/sh ## M4sh Initialization as_nop=: ... ## M4sh Shell Functions as_fn_nop () { return $?; } as_nop=as_fn_nop ... and AS_IF emits if CONDITION then : # ... else $as_nop # ... fi The uses of AS_IF that appear before the beginning of the M4sh Shell Functions section are all under our control and they don’t need to look at $?. If anyone has a better idea for how to make this work I will be glad to hear it. Fixes bug #110369. * lib/m4sugar/m4sh.m4 (_AS_IF_ELSE): When $1 is nonempty, invoke _AS_EMPTY_ELSE_PREPARE. Emit $as_nop at beginning of else clause. (_AS_BOURNE_COMPATIBLE): Initialize as_nop to ‘:’. (_AS_EMPTY_ELSE_PREPARE): New macro which emits a definition of as_fn_nop and resets as_nop to as_fn_nop. (AS_PREPARE, _AS_PREPARE): Invoke _AS_EMPTY_ELSE_PREPARE. (_AS_UNSET_PREPARE): Tweak white space. * tests/m4sh.at (AS_IF and AS_CASE): Test AS_IF’s IF-FALSE argument being empty after macro expansion. * doc/autoconf.texi (AS_IF): Remove warning about use with ‘run-if-false’ argument empty after macro expansion.
Diffstat (limited to 'tests')
-rw-r--r--tests/m4sh.at6
1 files changed, 2 insertions, 4 deletions
diff --git a/tests/m4sh.at b/tests/m4sh.at
index 633becdd..21c61237 100644
--- a/tests/m4sh.at
+++ b/tests/m4sh.at
@@ -1320,13 +1320,11 @@ dnl Handle blank arguments.
AS_IF([false], [:], [ ]) && AS_CASE([foo], [foo], []
) && echo seventeen
m4_define([empty])AS_IF([:], [empty]
-) && AS_CASE([foo], [foo], [empty]) && echo eighteen
+) && AS_IF([false], [], [empty]
+) || AS_CASE([foo], [foo], [empty]) && echo eighteen
dnl Allow for users that don't know to avoid trailing whitespace
AS_IF([:
], [echo nineteen])
-dnl We can't handle AS_IF([false], [:], [empty]) unless m4_expand is
-dnl taught how to handle m4_require. The user is responsible for
-dnl avoiding the syntax error in that case.
# check that require works correctly
m4_for([n], 1, 9, [],