| # Copyright © 2017-2018 Intel Corporation |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| project('gcc func attributes', ['c', 'cpp']) |
| |
| # For msvc these will fail because msvc doesn't support __attribute__, for |
| # Clang and GCC, they should pass. |
| c = meson.get_compiler('c') |
| cpp = meson.get_compiler('cpp') |
| |
| if c.get_id() == 'pgi' |
| error('MESON_SKIP_TEST: PGI supports its own set of features, will need a separate list for PGI to test it.') |
| endif |
| |
| expected_result = not ['msvc', 'clang-cl', 'intel-cl'].contains(c.get_id()) |
| |
| # Q: Why is ifunc not in this list or any of the below lists? |
| # A: It's too damn hard to figure out if you actually support it, since it |
| # requires both compiler and libc support, and there isn't a good way to |
| # figure that out except by running the code we're trying to test. |
| attributes = [ |
| 'aligned', |
| 'always_inline', |
| 'cold', |
| 'const', |
| 'constructor', |
| 'constructor_priority', |
| 'deprecated', |
| 'destructor', |
| 'flatten', |
| 'format', |
| 'format_arg', |
| 'gnu_inline', |
| 'hot', |
| 'malloc', |
| 'noinline', |
| 'nonnull', |
| 'noreturn', |
| 'nothrow', |
| 'pure', |
| 'unused', |
| 'used', |
| 'warn_unused_result', |
| 'weak', |
| ] |
| |
| if c.get_id() != 'intel' |
| # not supported by icc as of 19.0.0 |
| attributes += 'weakref' |
| endif |
| |
| # These are unsupported on darwin with apple clang 9.1.0 |
| if host_machine.system() != 'darwin' |
| attributes += 'alias' |
| attributes += 'visibility' |
| attributes += 'alloc_size' |
| endif |
| |
| if ['gcc', 'intel'].contains(c.get_id()) |
| # not supported by clang as of 5.0.0 (at least up to 6.0.1) |
| attributes += 'artificial' |
| attributes += 'error' |
| attributes += 'externally_visible' |
| attributes += 'leaf' |
| attributes += 'noclone' |
| attributes += 'optimize' |
| attributes += 'warning' |
| |
| if c.get_id() == 'gcc' and c.version().version_compare('>= 7.0.0') |
| attributes += 'fallthrough' |
| endif |
| endif |
| |
| if get_option('mode') == 'single' |
| foreach a : attributes |
| x = c.has_function_attribute(a) |
| assert(x == expected_result, '@0@: @1@'.format(c.get_id(), a)) |
| x = cpp.has_function_attribute(a) |
| assert(x == expected_result, '@0@: @1@'.format(cpp.get_id(), a)) |
| endforeach |
| |
| win_expect = ['windows', 'cygwin'].contains(host_machine.system()) |
| foreach a : ['dllexport', 'dllimport'] |
| assert(c.has_function_attribute(a) == win_expect, |
| '@0@: @1@'.format(c.get_id(), a)) |
| assert(cpp.has_function_attribute(a) == win_expect, |
| '@0@: @1@'.format(cpp.get_id(), a)) |
| endforeach |
| else |
| if not ['msvc', 'clang-cl', 'intel-cl'].contains(c.get_id()) |
| multi_expected = attributes |
| else |
| multi_expected = [] |
| endif |
| |
| multi_check = c.get_supported_function_attributes(attributes) |
| assert(multi_check == multi_expected, 'get_supported_function_arguments works (C)') |
| multi_check = cpp.get_supported_function_attributes(attributes) |
| assert(multi_check == multi_expected, 'get_supported_function_arguments works (C++)') |
| endif |