bug-gnulib@gnu.org mirror (unofficial)
 help / color / mirror / Atom feed
* xalloc: fix compilation error in C++ mode on FreeBSD 12
@ 2020-02-02 17:21 Bruno Haible
  0 siblings, 0 replies; only message in thread
From: Bruno Haible @ 2020-02-02 17:21 UTC (permalink / raw)
  To: bug-gnulib

Compiling a C++ file that includes xalloc.h, I get an error on FreeBSD 12:

In file included from ../../gltests/test-list-c++.cc:20:
In file included from ../../gltests/../gllib/gl_list.hh:22:
In file included from ../../gltests/../gllib/gl_xlist.h:22:
../../gltests/../gllib/xalloc.h:51:8: error: an attribute list cannot appear here
extern _Noreturn void xalloc_die (void);
       ^~~~~~~~~
/usr/include/sys/cdefs.h:280:20: note: expanded from macro '_Noreturn'
#define _Noreturn               [[noreturn]]
                                ^~~~~~~~~~~~
1 error generated.
*** Error code 1


The reason is as explained in [1]:

  While the syntax

     [[noreturn]] void func (...);

  and

     [[noreturn]] extern void func (...);

  are valid in C++, the syntax

     extern [[noreturn]] void func (...);

  is not. (clang and MSVC give an error, and gcc a warning.) One more example
  of how terrible C++ is at the syntactic level.

In this case, however, the definition of _Noreturn comes from the system.
I don't think it would be adequate to override it. So, fix the gnulib header
instead.

[1] https://lists.gnu.org/archive/html/bug-gnulib/2019-12/msg00013.html


2020-02-02  Bruno Haible  <bruno@clisp.org>

	xalloc: Fix compilation error in C++ mode on FreeBSD 12.
	* lib/xalloc.h (xalloc_die): Comment out 'extern' keyword before
	'_Noreturn'.
	* lib/sigpipe-die.h (sigpipe_die): Likewise.

diff --git a/lib/xalloc.h b/lib/xalloc.h
index 9563b0b..19c64ac 100644
--- a/lib/xalloc.h
+++ b/lib/xalloc.h
@@ -48,7 +48,7 @@ extern "C" {
    or by using gnulib's xalloc-die module.  This is the
    function to call when one wants the program to die because of a
    memory allocation failure.  */
-extern _Noreturn void xalloc_die (void);
+/*extern*/ _Noreturn void xalloc_die (void);
 
 void *xmalloc (size_t s)
       _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1));
diff --git a/lib/sigpipe-die.h b/lib/sigpipe-die.h
index dcb9a4a..7fcde8c 100644
--- a/lib/sigpipe-die.h
+++ b/lib/sigpipe-die.h
@@ -48,7 +48,7 @@ extern "C" {
 
 /* Emit an error message indicating a SIGPIPE signal, and terminate the
    process with an error code.  */
-extern _Noreturn void sigpipe_die (void);
+/*extern*/ _Noreturn void sigpipe_die (void);
 
 /* Install a SIGPIPE handler that invokes PREPARE_DIE and then emits an
    error message and exits.  PREPARE_DIE may be NULL, meaning a no-op.  */



^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2020-02-02 17:21 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-02 17:21 xalloc: fix compilation error in C++ mode on FreeBSD 12 Bruno Haible

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).