https://github.com/libsdl-org/autoconf/commit/c8d6d6eb8be36144f1285f35901e325b56bac68f
From c8d6d6eb8be36144f1285f35901e325b56bac68f Mon Sep 17 00:00:00 2001
From: Paul Eggert <[EMAIL REDACTED]>
Date: Thu, 31 Mar 2022 22:29:05 -0700
Subject: [PATCH] =?UTF-8?q?Fix=20bug=20with=20AS=5FIF=20and=20=E2=80=98set?=
=?UTF-8?q?=20-e=E2=80=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Problem reported by Peter Johansson in:
https://lists.gnu.org/r/bug-autoconf/2022-03/msg00009.html
The bug was introduced in 2020-11-15T18:56:18Z!zackw@panix.com
with commit message saying “If anyone has a better idea for how to
make this work I will be glad to hear it”, and this patch uses a
trick with ‘case’ that should be a better idea.
* lib/m4sugar/m4sh.m4 (as_nop, as_fn_nop, _AS_EMPTY_ELSE_PREPARE):
Remove. All uses removed.
(_AS_IF_ELSE): Wrap the non-blank IF-ELSE inside a no-op case,
which works since a case branch can be empty in the shell.
* tests/m4sh.at (AS_IF and AS_CASE): Test the fix.
---
lib/m4sugar/m4sh.m4 | 44 +++++++++++++-------------------------------
tests/m4sh.at | 4 ++++
2 files changed, 17 insertions(+), 31 deletions(-)
diff --git a/lib/m4sugar/m4sh.m4 b/lib/m4sugar/m4sh.m4
index b2075315..e6067ecf 100644
--- a/lib/m4sugar/m4sh.m4
+++ b/lib/m4sugar/m4sh.m4
@@ -98,10 +98,9 @@ _$0
# _AS_BOURNE_COMPATIBLE
# ---------------------
# This is the part of AS_BOURNE_COMPATIBLE which has to be repeated inside
-# each instance. See _AS_EMPTY_ELSE_PREPARE for explanation of as_nop.
+# each instance.
m4_define([_AS_BOURNE_COMPATIBLE],
-[as_nop=:
-AS_IF([test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1],
+[AS_IF([test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1],
[emulate sh
NULLCMD=:
[#] Pre-4.2 versions of Zsh do word splitting on ${1+"$[@]"}, which
@@ -352,8 +351,7 @@ m4_defun([_AS_PREPARE],
[m4_pushdef([AS_MESSAGE_LOG_FD], [-1])]dnl
[_AS_ERROR_PREPARE
_m4_popdef([AS_MESSAGE_LOG_FD])]dnl
-[_AS_EMPTY_ELSE_PREPARE
-_AS_EXIT_PREPARE
+[_AS_EXIT_PREPARE
_AS_UNSET_PREPARE
_AS_VAR_APPEND_PREPARE
_AS_VAR_ARITH_PREPARE
@@ -389,7 +387,6 @@ AS_REQUIRE([_AS_CR_PREPARE])
AS_REQUIRE([_AS_LINENO_PREPARE])
AS_REQUIRE([_AS_ECHO_N_PREPARE])
AS_REQUIRE([_AS_EXIT_PREPARE])
-AS_REQUIRE([_AS_EMPTY_ELSE_PREPARE])
AS_REQUIRE([_AS_LN_S_PREPARE])
AS_REQUIRE([_AS_MKDIR_P_PREPARE])
AS_REQUIRE([_AS_TEST_PREPARE])
@@ -672,18 +669,13 @@ done[]_m4_popdef([$1])])
# | fi
# with simplifications when IF-TRUE1 and/or IF-FALSE are empty.
#
-# Note: IF-TRUEn and IF_FALSE may be nonempty but, after further macro
-# expansion, leave no actual shell code. We can't detect this, so we
-# include a no-op statement in each clause to prevent it becoming a shell
-# syntax error. For the IF-TRUEn this can simply be ':' at the beginning of
-# the clause. IF-FALSE is harder because it must preserve the value of $?
-# from the conditional expression. The most practical way to do this is
-# with a shell function whose body is 'return $?' but AS_IF is used before
-# it's safe to use shell functions. To deal with *that*, there is a shell
-# variable $as_fn_nop that expands to ':' before the nop shell function is
-# defined, and invokes the nop shell function afterward. Early uses of
-# AS_IF (which are all under our control) must not use the value of $? from
-# the conditional expression in an else clause.
+# Note: IF-TRUEn and IF-FALSE may be nonempty but, after further macro
+# expansion, leave no actual shell code. We can't detect this, so
+# surround each clause with appropriate shell syntax so that it is valid
+# even if it is empty. For the IF-TRUEn this can simply be ':' before
+# the clause. IF-FALSE is harder because it might use the value of $?
+# from the conditional expression. One way to do this is to write
+# 'case e in e) IF-FALSE ;; esac' which is valid even if IF-FALSE is empty.
m4_define([_AS_IF],
[elif $1
then :
@@ -691,9 +683,9 @@ then :
])
m4_defun([_AS_IF_ELSE],
[m4_ifnblank([$1],
-[m4_append_uniq([_AS_CLEANUP], [AS_REQUIRE([_AS_EMPTY_ELSE_PREPARE])])]dnl
-[else $as_nop
- $1
+[else case e in @%:@(
+ e) $1 ;;
+esac
])])
m4_defun([AS_IF],
@@ -703,16 +695,6 @@ then :
m4_map_args_pair([_$0], [_$0_ELSE], m4_shift2($@))]dnl
[fi[]])# AS_IF
-m4_defun([_AS_EMPTY_ELSE_PREPARE],
-[m4_divert_text([M4SH-INIT-FN],
-[AS_FUNCTION_DESCRIBE([as_fn_nop], [],
- [Do nothing but, unlike ":", preserve the value of $][?.])
-as_fn_nop ()
-{
- return $[]?
-}
-as_nop=as_fn_nop])])
-
# AS_SET_STATUS(STATUS)
# ---------------------
diff --git a/tests/m4sh.at b/tests/m4sh.at
index a20b8b13..a5c2272d 100644
--- a/tests/m4sh.at
+++ b/tests/m4sh.at
@@ -1423,6 +1423,9 @@ m4_define([empty])AS_IF([:], [empty]
dnl Allow for users that don't know to avoid trailing whitespace
AS_IF([:
], [echo nineteen])
+set -e
+AS_IF([false], [], [echo twenty])
+set +e
# check that require works correctly
m4_for([n], 1, 9, [],
@@ -1478,6 +1481,7 @@ sixteen
seventeen
eighteen
nineteen
+twenty
foo1=1 bar1=1
foo2=2 bar2=
foo3=3 bar3=