From dc19b132024f818bfbd3e140e8141cbcabb3d720 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sat, 18 Apr 2020 06:36:47 +0530 Subject: [PATCH] compilers: Silence warning about gnu_inline with clang The warning is due to a change in behaviour in Clang 10 and newer: https://releases.llvm.org/10.0.0/tools/clang/docs/ReleaseNotes.html#c-language-changes-in-clang This was already fixed for clang++, but not for clang for some reason. It was also fixed incorrectly; by adding `extern` instead of moving from `-Werror` to `-Werror=attributes`. --- mesonbuild/compilers/c_function_attributes.py | 3 --- mesonbuild/compilers/mixins/clang.py | 5 +++++ mesonbuild/compilers/mixins/clike.py | 11 ++++++++--- mesonbuild/compilers/mixins/gnu.py | 5 +++++ 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/mesonbuild/compilers/c_function_attributes.py b/mesonbuild/compilers/c_function_attributes.py index 3b9fdf9c0..e5de4853e 100644 --- a/mesonbuild/compilers/c_function_attributes.py +++ b/mesonbuild/compilers/c_function_attributes.py @@ -127,7 +127,4 @@ CXX_FUNC_ATTRIBUTES = { 'static int (*resolve_foo(void))(void) { return my_foo; }' '}' 'int foo(void) __attribute__((ifunc("resolve_foo")));'), - # Clang >= 10 requires the 'extern' keyword - 'gnu_inline': - 'extern inline __attribute__((gnu_inline)) int foo(void) { return 0; }', } diff --git a/mesonbuild/compilers/mixins/clang.py b/mesonbuild/compilers/mixins/clang.py index 92f8c5f27..1c0ee452f 100644 --- a/mesonbuild/compilers/mixins/clang.py +++ b/mesonbuild/compilers/mixins/clang.py @@ -112,3 +112,8 @@ class ClangCompiler(GnuLikeCompiler): 'Cannot find linker {}.'.format(linker)) return ['-fuse-ld={}'.format(linker)] return super().use_linker_args(linker) + + def get_has_func_attribute_extra_args(self, name): + # Clang only warns about unknown or ignored attributes, so force an + # error. + return ['-Werror=attributes'] diff --git a/mesonbuild/compilers/mixins/clike.py b/mesonbuild/compilers/mixins/clike.py index 41848bccc..24f4796fd 100644 --- a/mesonbuild/compilers/mixins/clike.py +++ b/mesonbuild/compilers/mixins/clike.py @@ -1115,6 +1115,12 @@ class CLikeCompiler: m = pattern.match(ret) return ret + def get_has_func_attribute_extra_args(self, name): + # Most compilers (such as GCC and Clang) only warn about unknown or + # ignored attributes, so force an error. Overriden in GCC and Clang + # mixins. + return ['-Werror'] + def has_func_attribute(self, name, env): # Just assume that if we're not on windows that dllimport and dllexport # don't work @@ -1123,6 +1129,5 @@ class CLikeCompiler: if name in ['dllimport', 'dllexport']: return False, False - # Clang and GCC both return warnings if the __attribute__ is undefined, - # so set -Werror - return self.compiles(self.attribute_check_func(name), env, extra_args='-Werror') + return self.compiles(self.attribute_check_func(name), env, + extra_args=self.get_has_func_attribute_extra_args(name)) diff --git a/mesonbuild/compilers/mixins/gnu.py b/mesonbuild/compilers/mixins/gnu.py index 29552f371..3526a91d4 100644 --- a/mesonbuild/compilers/mixins/gnu.py +++ b/mesonbuild/compilers/mixins/gnu.py @@ -369,3 +369,8 @@ class GnuCompiler(GnuLikeCompiler): if self.language in {'c', 'objc'} and 'is valid for C++/ObjC++' in p.stde: result = False return result, p.cached + + def get_has_func_attribute_extra_args(self, name): + # GCC only warns about unknown or ignored attributes, so force an + # error. + return ['-Werror=attributes']