Building a Gnulib testdir on FreeBSD 12.0, which uses clang 6.0.1, I see many warnings such as
../../gltests/test-dirent-c++.cc:28:1: warning: unknown attribute '__maybe_unused__' ignored [-Wunknown-attributes] The cause is that in this version of clang, __has_c_attribute(__maybe_unused__) apparently returns true, and the use of [[__maybe_unused__]] does not elicit a syntax error. But it elicits a warning. Here's how it depends on the clang version: clang result ----- ------- 4.0.0 error 5.0.2 error 6.0.1 warning 7.0.1 warning 8.0.0 warning 9.0.0 warning 10.0.0 ok This patch fixes the warnings, by choosing a different (more conservative) expansion of _GL_ATTRIBUTE_MAYBE_UNUSED. 2023-01-28 Bruno Haible <[email protected]> Avoid clang warnings regarding [[__maybe_unused__]]. * m4/gnulib-common.m4 (gl_COMMON_BODY): For clang versions ≥ 6, < 10, in C++ mode, ignore the __has_c_attribute value and define _GL_ATTRIBUTE_MAYBE_UNUSED to __attribute__ ((__unused__)), not [[__maybe_unused__]]. diff --git a/m4/gnulib-common.m4 b/m4/gnulib-common.m4 index 0f1a6ac1ea..cf0fc5a1e7 100644 --- a/m4/gnulib-common.m4 +++ b/m4/gnulib-common.m4 @@ -1,4 +1,4 @@ -# gnulib-common.m4 serial 78 +# gnulib-common.m4 serial 79 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, @@ -351,9 +351,15 @@ AC_DEFUN([gl_COMMON_BODY], [ in C++ also: class. */ /* In C++ and C23, this is spelled [[__maybe_unused__]]. GCC's syntax is __attribute__ ((__unused__)). - clang supports both syntaxes. */ + clang supports both syntaxes. Except that with clang ≥ 6, < 10, in C++ mode, + __has_c_attribute (__maybe_unused__) yields true but the use of + [[__maybe_unused__]] nevertheless produces a warning. */ #ifndef _GL_ATTRIBUTE_MAYBE_UNUSED -# ifdef __has_c_attribute +# if defined __clang__ && defined __cplusplus +# if __clang_major__ >= 10 +# define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]] +# endif +# elif defined __has_c_attribute # if __has_c_attribute (__maybe_unused__) # define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]] # endif
