Ozkan Sezer wrote: > >> The attached patch makes gl_VISIBILITY to reject unsupported configurations > >> with newer gcc: In its current form, mingw gcc-4.5.4 rejects the attributes > >> but gcc-7.5 does not, apparently because the attributes are applied to func > >> prototypes without their definitions. Attaching a hidden visibility attrib > >> to dummyfunc() makes gcc-7.5 to reject it properly. > > > > I don't fully understand why we should apply the patch. > > > > With gcc 7.5 on mingw and the visibility.m4 that is in gnulib now: > > What is the result of the > > checking for simple visibility declarations... > > test? What are the effects: warnings? compilation errors? link errors? too > > many exported symbols? too few exported symbols? > > No warnings from the testcase in m4. In real-life, it results in warnings, > see e.g.: https://github.com/libsndfile/libsamplerate/issues/154
OK, I understand better now. In the GCC source code I see that the "visibility attribute not supported in this configuration; ignored" warning is emitted when a definition is emitted. Therefore I think the safest patch is to add a definition for each declaration in the test code. 2021-06-05 Bruno Haible <br...@clisp.org> lib-symbol-visibility: Make configure check work for newer GCC. Reported by Ozkan Sezer <seze...@gmail.com> in <https://lists.gnu.org/archive/html/bug-gnulib/2021-05/msg00117.html>. * m4/visibility.m4 (gl_VISIBILITY): Add a function definition for each declaration in the test program. diff --git a/m4/visibility.m4 b/m4/visibility.m4 index 8f27a12..d161bd7 100644 --- a/m4/visibility.m4 +++ b/m4/visibility.m4 @@ -1,4 +1,4 @@ -# visibility.m4 serial 7 +# visibility.m4 serial 8 dnl Copyright (C) 2005, 2008, 2010-2021 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -59,6 +59,10 @@ AC_DEFUN([gl_VISIBILITY], extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void); extern __attribute__((__visibility__("default"))) int exportedfunc (void); void dummyfunc (void); + int hiddenvar; + int exportedvar; + int hiddenfunc (void) { return 51; } + int exportedfunc (void) { return 1225736919; } void dummyfunc (void) {} ]], [[]])],