Paul Eggert wrote:
> diff --git a/modules/unitypes-h b/modules/unitypes-h
> index faf0d89b6c..b512947c73 100644
> --- a/modules/unitypes-h
> +++ b/modules/unitypes-h
> @@ -26,8 +26,7 @@ AH_VERBATIM([unitypes_restrict], [
>  #  define _UC_RESTRICT restrict
>  # else
>  #  define _UC_RESTRICT
> -# endif
> -])
> +# endif])
>  
>  Makefile.am:
>  BUILT_SOURCES += $(LIBUNISTRING_UNITYPES_H)
> 

I don't like this way of putting a closing ]) on the same line as C code,
because in the past I've encountered cases where Autoconf did not add a
newline, and the result were invalid C preprocessor expressions.

> Likewise, bearing in mind that configure.ac lines will be indented
> so such lines containing only '])' should be avoided when they
> generate C code.

It is gnulib-tool which adds 2 spaces of indentation when copying the
contents of the configure.ac part of a module description. We could
possibly fix this in gnulib-tool (so that it recognizes AH_VERBATIM,
AH_TOP, and AH_BOTTOM invocations specially), but it sounds like
overkill for this one AH_VERBATIM invocation that we have. It's
simpler to move out this AH_VERBATIM invocation:


2025-04-18  Bruno Haible  <br...@clisp.org>

        unitypes-h: Avoid risky coding pattern.
        * m4/unitypes_h.m4: New file, based on modules/unitypes-h.
        * modules/unitypes-h (Files): Add it.
        (configure.ac): Invoke gl_UNITYPES_H. Remove AH_VERBATIM invocation.

diff --git a/m4/unitypes_h.m4 b/m4/unitypes_h.m4
new file mode 100644
index 0000000000..264e61be6c
--- /dev/null
+++ b/m4/unitypes_h.m4
@@ -0,0 +1,26 @@
+# unitypes_h.m4
+# serial 1
+dnl Copyright (C) 2021-2025 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl This file is offered as-is, without any warranty.
+
+AC_DEFUN_ONCE([gl_UNITYPES_H],
+[
+  AH_VERBATIM([unitypes_restrict], [
+/* This definition is a duplicate of the one in unitypes.h.
+   It is here so that we can cope with an older version of unitypes.h
+   that does not contain this definition and that is pre-installed among
+   the public header files.  */
+# if defined __restrict \
+     || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+     || __clang_major__ >= 3
+#  define _UC_RESTRICT __restrict
+# elif 199901L <= __STDC_VERSION__ || defined restrict
+#  define _UC_RESTRICT restrict
+# else
+#  define _UC_RESTRICT
+# endif
+])
+])
diff --git a/modules/unitypes-h b/modules/unitypes-h
index b512947c73..0d83814c1d 100644
--- a/modules/unitypes-h
+++ b/modules/unitypes-h
@@ -3,6 +3,7 @@ Base types for Unicode string functions.
 
 Files:
 lib/unitypes.in.h
+m4/unitypes_h.m4
 m4/libunistring-base.m4
 
 Depends-on:
@@ -12,21 +13,7 @@ stdint-h
 configure.ac:
 gl_LIBUNISTRING_LIBHEADER([0.9.11], [unitypes.h])
 AC_PROG_MKDIR_P
-
-AH_VERBATIM([unitypes_restrict], [
-/* This definition is a duplicate of the one in unitypes.h.
-   It is here so that we can cope with an older version of unitypes.h
-   that does not contain this definition and that is pre-installed among
-   the public header files.  */
-# if defined __restrict \
-     || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
-     || __clang_major__ >= 3
-#  define _UC_RESTRICT __restrict
-# elif 199901L <= __STDC_VERSION__ || defined restrict
-#  define _UC_RESTRICT restrict
-# else
-#  define _UC_RESTRICT
-# endif])
+gl_UNITYPES_H
 
 Makefile.am:
 BUILT_SOURCES += $(LIBUNISTRING_UNITYPES_H)




Reply via email to