Thanks for the suggestion. I installed the attached more-elaborate patch, which also affects autom4te and autoscan.
From 7feeafdf2f3e5bfe670b40994092d2e8ec5a536c Mon Sep 17 00:00:00 2001
From: Paul Eggert <egg...@cs.ucla.edu>
Date: Sat, 15 Jun 2024 08:24:05 -0700
Subject: [PATCH] Process C23 #elifdef and #elifndef
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Inspired by Collin Funk’s suggestion in:
https://lists.gnu.org/r/autoconf-patches/2024-06/msg00000.html
* bin/autom4te.in (handle_output):
* bin/autoscan.in, bin/ifnames.in (scan_c_file):
Also recognize #elifdef and #elifndef.
* tests/tools.at (ifnames): Test it for ifnames.
---
 NEWS              | 6 ++++++
 bin/autom4te.in   | 4 ++--
 bin/autoscan.in   | 2 +-
 bin/ifnames.in    | 9 +++++----
 doc/autoconf.texi | 5 +++--
 tests/tools.at    | 4 ++++
 6 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/NEWS b/NEWS
index 521bbd3a..bca11391 100644
--- a/NEWS
+++ b/NEWS
@@ -22,6 +22,12 @@ GNU Autoconf NEWS - User visible changes.
   This reverts to Autoconf 2.69 behavior, and also fixes a bug where
   AC_PROG_CXX rejected C++20 compilers.
 
+** New features
+
+*** Programs now recognize #elifdef and #elifndef.
+  The autom4te, autoscan and ifnames programs now recognize the two
+  preprocessor directives, which were introduced in C23 and C++23.
+
 * Noteworthy changes in release 2.72 (2023-12-22) [release]
 
 ** Backward incompatibilities
diff --git a/bin/autom4te.in b/bin/autom4te.in
index e9fa1886..48377cb9 100644
--- a/bin/autom4te.in
+++ b/bin/autom4te.in
@@ -636,7 +636,7 @@ sub handle_output ($$)
       # Don't complain in comments.  Well, until we have something
       # better, don't consider '#include' etc. are comments.
       s/\#.*//
-	unless /^\#\s*(if|include|endif|ifdef|ifndef|define)\b/;
+	unless /^\#\s*(include|endif|(el)?if(n?def)?|define)\b/;
       foreach (split (/\W+/))
 	{
 	  $prohibited{$_} = $.
@@ -673,7 +673,7 @@ sub handle_output ($$)
 	  # Don't complain in comments.  Well, until we have something
 	  # better, don't consider '#include' etc. to be comments.
 	  s/\#.*//
-	    unless /^\#(if|include|endif|ifdef|ifndef|define)\b/;
+	    unless /^\#(include|endif|(el)?if(n?def)?|define)\b/;
 
 	  # Complain once per word, but possibly several times per line.
 	  while (/$prohibited/)
diff --git a/bin/autoscan.in b/bin/autoscan.in
index 5072f80c..542865a9 100644
--- a/bin/autoscan.in
+++ b/bin/autoscan.in
@@ -276,7 +276,7 @@ sub scan_c_file ($)
 	    {
 	      used ('header', $1);
 	    }
-	  if (s/^(if|ifdef|ifndef|elif)\s+//)
+	  if (s/^(el)?if(n?def)?\s+//)
 	    {
 	      foreach my $word (split (/\W+/))
 		{
diff --git a/bin/ifnames.in b/bin/ifnames.in
index c0c5f611..59a3d131 100644
--- a/bin/ifnames.in
+++ b/bin/ifnames.in
@@ -55,9 +55,10 @@ $help = "Usage: $0 [OPTION]... [FILE]...
 
 Scan all of the C source FILES (or the standard input, if none are
 given) and write to the standard output a sorted list of all the
-identifiers that appear in those files in '#if', '#elif', '#ifdef', or
-'#ifndef' directives.  Print each identifier on a line, followed by a
-space-separated list of the files in which that identifier occurs.
+identifiers that appear in those files in '#if', '#ifdef', '#ifndef',
+'#elif', '#elifdef', or '#elifndef' directives.  Print each identifier
+on a line, followed by a space-separated list of the files in which
+that identifier occurs.
 
   -h, --help      print this help, then exit
   -V, --version   print version number, then exit
@@ -109,7 +110,7 @@ sub scan_file ($)
 	while (s/\\$//);
 
       # Preprocessor directives.
-      if (s/^\s*\#\s*(if|ifdef|ifndef|elif)\s+//)
+      if (s/^\s*\#\s*(el)?if(n?def)?\s+//)
 	{
 	  # Remove comments.  Not perfect, but close enough.
 	  s(/\*.*?\*/)();
diff --git a/doc/autoconf.texi b/doc/autoconf.texi
index 9c05ecee..832858cf 100644
--- a/doc/autoconf.texi
+++ b/doc/autoconf.texi
@@ -1478,8 +1478,9 @@ Invocation}).
 @command{ifnames} scans all of the C source files named on the command line
 (or the standard input, if none are given) and writes to the standard
 output a sorted list of all the identifiers that appear in those files
-in @code{#if}, @code{#elif}, @code{#ifdef}, or @code{#ifndef}
-directives.  It prints each identifier on a line, followed by a
+in @code{#if}, @code{#ifdef}, @code{#ifndef}, @code{#elif},
+@code{#elifdef}, or @code{#elifndef} directives.
+It prints each identifier on a line, followed by a
 space-separated list of the files in which that identifier occurs.
 
 @noindent
diff --git a/tests/tools.at b/tests/tools.at
index 37fe1466..867ecd68 100644
--- a/tests/tools.at
+++ b/tests/tools.at
@@ -732,6 +732,8 @@ LINE2
 
 AT_DATA([iftest2.c],
 [[#ifdef IFTEST2
+#elifdef IFTEST3
+#elifndef IFTEST4
 #if VAL1
 ]])
 
@@ -741,6 +743,8 @@ DEF2 iftest1.c
 DEF3 iftest1.c
 DEF4 iftest1.c
 IFTEST2 iftest2.c
+IFTEST3 iftest2.c
+IFTEST4 iftest2.c
 LINE1 iftest1.c
 LINE2 iftest1.c
 SPACES iftest1.c
-- 
2.43.0

Reply via email to