Make cc.has_function work on GCC/Clang __builtins

pull/6901/head
Andrei Alexeyev 5 years ago committed by Jussi Pakkanen
parent 1a741e0439
commit 96ed64caa1
  1. 11
      mesonbuild/compilers/mixins/clike.py
  2. 8
      test cases/common/39 has function/meson.build

@ -727,22 +727,23 @@ class CLikeCompiler:
# need to look for them differently. On nice compilers like clang, we
# can just directly use the __has_builtin() macro.
fargs['no_includes'] = '#include' not in prefix
fargs['__builtin_'] = '' if funcname.startswith('__builtin_') else '__builtin_'
t = '''{prefix}
int main(void) {{
#ifdef __has_builtin
#if !__has_builtin(__builtin_{func})
#error "__builtin_{func} not found"
#if !__has_builtin({__builtin_}{func})
#error "{__builtin_}{func} not found"
#endif
#elif ! defined({func})
/* Check for __builtin_{func} only if no includes were added to the
/* Check for {__builtin_}{func} only if no includes were added to the
* prefix above, which means no definition of {func} can be found.
* We would always check for this, but we get false positives on
* MSYS2 if we do. Their toolchain is broken, but we can at least
* give them a workaround. */
#if {no_includes:d}
__builtin_{func};
{__builtin_}{func};
#else
#error "No definition for __builtin_{func} found in the prefix"
#error "No definition for {__builtin_}{func} found in the prefix"
#endif
#endif
return 0;

@ -88,4 +88,12 @@ foreach cc : compilers
assert (cc.has_function('sendmmsg', args : unit_test_args),
'Failed to detect function "sendmmsg" (should always exist).')
endif
# We should be able to find GCC and Clang __builtin functions
if ['gcc', 'clang'].contains(cc.get_id())
# __builtin_constant_p is documented to exist at least as far back as
# GCC 2.95.3
assert(cc.has_function('__builtin_constant_p', args : unit_test_args),
'__builtin_constant_p must be found under gcc and clang')
endif
endforeach

Loading…
Cancel
Save