diff options
author | Paolo Bonzini <bonzini@gnu.org> | 2016-10-31 18:08:08 +0100 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2016-11-04 16:12:52 -0500 |
commit | 527f183f232e14ebf0ef2b8a086d675e78700af2 (patch) | |
tree | c7c507a892a9490255f02608af598d49ae0a1aad /lib/autoconf/general.m4 | |
parent | b2621a91d70e5c86f4fbdce25eeb0f83df6645b6 (diff) | |
download | autoconf-527f183f232e14ebf0ef2b8a086d675e78700af2.tar.gz |
autoconf: refine quadrigraph test in _AC_DEFINE_UNQUOTED
It is a very common case that a quadrigraph appears in the argument of
_AC_DEFINE_UNQUOTED, because "#define" is expanded through a quadrigraph.
Therefore, restrict the quadrigraph tests to "$" (for "$(" and "${")
and "(" (for "$(").
At the same time, "#" should not be used inside AC_ECHO because it confuses
m4's comment parsing. This pre-existing latent bug is caught by test 251:
AC_DEFINE_UNQUOTED([bar], [[%!_!# X]])
Previously the quadrigraph in "@%:@define bar %!_!# X" made Autoconf fall back
to cat anyway. Now that Autoconf is not fooled by the quadrigraph, the test
catches that "#" is not special-cased. Kudos to Eric for coming up with it!
* lib/autoconf/general (_AC_DEFINE_UNQUOTED): Do not blindly
use cat on all quadrigraphs.
Signed-off-by: Paolo Bonzini <bonzini@gnu.org>
Message-Id: <1477933688-4884-4-git-send-email-bonzini@gnu.org>
Diffstat (limited to 'lib/autoconf/general.m4')
-rw-r--r-- | lib/autoconf/general.m4 | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/lib/autoconf/general.m4 b/lib/autoconf/general.m4 index c15fb132..ef6285d6 100644 --- a/lib/autoconf/general.m4 +++ b/lib/autoconf/general.m4 @@ -2167,9 +2167,11 @@ m4_define([AC_DEFINE_UNQUOTED], [_AC_DEFINE_Q([_$0], $@)]) # Append the pre-expanded STRING and a newline to confdefs.h, as if # with an unquoted here-doc, but avoiding a fork in the common case of # no backslash, no command substitution, no complex variable -# substitution, and no quadrigraphs. +# substitution (taking into account quadrigraphs as well). Also +# avoid AS_ECHO if "#" is present to avoid confusing m4 with comments, +# but quadrigraphs are fine in that case. m4_define([_AC_DEFINE_UNQUOTED], -[m4_if(m4_bregexp([$1], [\\\|`\|\$(\|\${\|@]), [-1], +[m4_if(m4_bregexp([$1], [#\|\\\|`\|\(\$\|@S|@\)\((|{|@{:@\)]), [-1], [AS_ECHO(["AS_ESCAPE([$1], [""])"]) >>confdefs.h], [cat >>confdefs.h <<_ACEOF [$1] |