Building a Gnulib testdir on FreeBSD 12.0, which uses clang 6.0.1, I see several warnings such as
../../gltests/../gllib/gl_list.h:642:1: warning: unknown attribute '__nodiscard__' ignored [-Wunknown-attributes] The cause is that in this version of clang, __has_c_attribute(__nodiscard__) apparently returns true, but the use of [[__nodiscard__]] elicits a warning. Here's how it depends on the clang version: clang result ----- ------- 5.0.2 error 6.0.1 warning 7.0.1 warning 8.0.0 warning 9.0.0 warning 10.0.0 warning 11.0.0 warning 12.0.1 warning 13.0.0 warning 14.0.0 warning 15.0.6 warning This patch fixes the warnings, by choosing a different (more conservative) expansion of _GL_ATTRIBUTE_NODISCARD. 2023-01-28 Bruno Haible <br...@clisp.org> Avoid clang warnings regarding [[__nodiscard__]]. * m4/gnulib-common.m4 (gl_COMMON_BODY): For clang, in C++ mode, ignore the __has_c_attribute value and define _GL_ATTRIBUTE_NODISCARD to __attribute__ ((__warn_unused_result__)), not [[__nodiscard__]]. diff --git a/m4/gnulib-common.m4 b/m4/gnulib-common.m4 index cf0fc5a1e7..d632819864 100644 --- a/m4/gnulib-common.m4 +++ b/m4/gnulib-common.m4 @@ -1,4 +1,4 @@ -# gnulib-common.m4 serial 79 +# gnulib-common.m4 serial 80 dnl Copyright (C) 2007-2023 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -379,7 +379,13 @@ AC_DEFUN([gl_COMMON_BODY], [ the return value, unless the caller uses something like ignore_value. */ /* Applies to: function, enumeration, class. */ #ifndef _GL_ATTRIBUTE_NODISCARD -# ifdef __has_c_attribute +# if defined __clang__ && defined __cplusplus + /* With clang up to 15.0.6 (at least), in C++ mode, [[__nodiscard__]] produces + a warning. */ +# if __clang_major__ >= 1000 +# define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]] +# endif +# elif defined __has_c_attribute # if __has_c_attribute (__nodiscard__) # define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]] # endif