From 2fb0672b4058a81fd977d75865ea3c3aaded4fb6 Mon Sep 17 00:00:00 2001
From: Bruno Haible <bruno@clisp.org>
Date: Sat, 7 Aug 2021 19:00:42 +0200
Subject: [PATCH] argp: Improve GCC 11 allocation-deallocation checking.

* lib/argp-fmtstream.h (__argp_fmtstream_free, argp_fmtstream_free):
Move declarations up.
(__argp_make_fmtstream): Declare that deallocation must happen through
'__argp_fmtstream_free'.
(argp_make_fmtstream): Declare that deallocation must happen through
'argp_fmtstream_free'.
---
 ChangeLog            | 10 ++++++++++
 lib/argp-fmtstream.h | 14 ++++++++------
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 8039f31483..84d3d008c4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2021-08-07  Bruno Haible  <bruno@clisp.org>
+
+	argp: Improve GCC 11 allocation-deallocation checking.
+	* lib/argp-fmtstream.h (__argp_fmtstream_free, argp_fmtstream_free):
+	Move declarations up.
+	(__argp_make_fmtstream): Declare that deallocation must happen through
+	'__argp_fmtstream_free'.
+	(argp_make_fmtstream): Declare that deallocation must happen through
+	'argp_fmtstream_free'.
+
 2021-08-07  Bruno Haible  <bruno@clisp.org>
 
 	areadlink, areadlinkat: Improve GCC 11 allocation-deallocation checking.
diff --git a/lib/argp-fmtstream.h b/lib/argp-fmtstream.h
index 79ba4844f8..3384a0012b 100644
--- a/lib/argp-fmtstream.h
+++ b/lib/argp-fmtstream.h
@@ -95,6 +95,10 @@ struct argp_fmtstream
 
 typedef struct argp_fmtstream *argp_fmtstream_t;
 
+/* Flush __FS to its stream, and free it (but don't close the stream).  */
+extern void __argp_fmtstream_free (argp_fmtstream_t __fs);
+extern void argp_fmtstream_free (argp_fmtstream_t __fs);
+
 /* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines
    written on it with LMARGIN spaces and limits them to RMARGIN columns
    total.  If WMARGIN >= 0, words that extend past RMARGIN are wrapped by
@@ -104,15 +108,13 @@ typedef struct argp_fmtstream *argp_fmtstream_t;
 extern argp_fmtstream_t __argp_make_fmtstream (FILE *__stream,
                                                size_t __lmargin,
                                                size_t __rmargin,
-                                               ssize_t __wmargin);
+                                               ssize_t __wmargin)
+  _GL_ATTRIBUTE_DEALLOC (__argp_fmtstream_free, 1);
 extern argp_fmtstream_t argp_make_fmtstream (FILE *__stream,
                                              size_t __lmargin,
                                              size_t __rmargin,
-                                             ssize_t __wmargin);
-
-/* Flush __FS to its stream, and free it (but don't close the stream).  */
-extern void __argp_fmtstream_free (argp_fmtstream_t __fs);
-extern void argp_fmtstream_free (argp_fmtstream_t __fs);
+                                             ssize_t __wmargin)
+  _GL_ATTRIBUTE_DEALLOC (argp_fmtstream_free, 1);
 
 extern ssize_t __argp_fmtstream_printf (argp_fmtstream_t __fs,
                                         const char *__fmt, ...)
-- 
2.39.5