blob: 92b944f352f20b8990d8f2c2c95a980606663fcf [file] [log] [blame]
/* PR c/66970 - Add __has_builtin() macro
Verify __has_builtin evaluation for common built-ins and other identifiers.
{ dg-do compile } */
// Verify a few library built-ins.
#if !__has_builtin (__builtin_abs)
# error "__has_builtin (__builtin_abs) failed"
#endif
#if !__has_builtin (abs)
// abs is also a built-in unless disabled by -fno-builtin.
# error "__has_builtin (abs) failed"
#endif
#if __cplusplus
// Declare an overload and verify that __has_builtin (isalpha) still
// evaluates to true.
int isalpha (const char*);
#endif
#if !__has_builtin (__builtin_isalpha)
# error "__has_builtin (__builtin_isalpha) failed"
#endif
#if !__has_builtin (isalpha)
// isalpha is still a built-in despite the overload above.
# error "__has_builtin (isalpha) failed"
#endif
#if !__has_builtin (__builtin__Exit)
# error "__has_builtin (__builtin__Exit) failed"
#endif
#if !__has_builtin (__builtin_alloca)
# error "__has_builtin (__builtin_alloca) failed"
#endif
#if !__has_builtin (__builtin_is_constant_evaluated)
// __builtin_is_constant_evaluated is a C++-only built.
# ifdef __cplusplus
# error "__has_builtin (__builtin_is_constant_evaluated) failed"
# endif
#else
# ifndef __cplusplus
# error "__has_builtin (__builtin_is_constant_evaluated) failed"
# endif
#endif
#if !__has_builtin (__builtin_expect)
# error "__has_builtin (__builtin_expect) failed"
#endif
#if !__has_builtin (__builtin_trap)
# error "__has_builtin (__builtin_trap) failed"
#endif
#if !__has_builtin (__builtin_unreachable)
# error "__has_builtin (__builtin_unreachable) failed"
#endif
#if !__has_builtin (__builtin_LINE)
# error "__has_builtin (__builtin_LINE) failed"
#endif
#if !__has_builtin (__builtin_object_size)
# error "__has_builtin (__builtin_object_size) failed"
#endif
#if !__has_builtin (__builtin_inf)
# error "__has_builtin (__builtin_inf) failed"
#endif
#if !__has_builtin (__builtin_nan)
# error "__has_builtin (__builtin_nan) failed"
#endif
#if !__has_builtin (__builtin_bswap16)
# error "__has_builtin (__builtin_bswap16) failed"
#endif
#if !__has_builtin (__builtin_bswap32)
# error "__has_builtin (__builtin_bswap32) failed"
#endif
// Verify a few integer overflow built-ins.
#if !__has_builtin (__builtin_add_overflow)
# error "__has_builtin (__builtin_add_overflow) failed"
#endif
#if !__has_builtin (__builtin_sadd_overflow)
# error "__has_builtin (__builtin_sadd_overflow) failed"
#endif
#if !__has_builtin (__builtin_add_overflow_p)
# error "__has_builtin (__builtin_add_overflow_p) failed"
#endif
// Verify a few atomic built-ins.
#if !__has_builtin (__atomic_load)
# error "__has_builtin (__atomic_load) failed"
#endif
#if !__has_builtin (__atomic_load_n)
# error "__has_builtin (__atomic_load_n) failed"
#endif
#if !__has_builtin (__atomic_store)
# error "__has_builtin (__atomic_store) failed"
#endif
#if !__has_builtin (__atomic_store_n)
# error "__has_builtin (__atomic_store_n) failed"
#endif
#if !__has_builtin (__atomic_exchange)
# error "__has_builtin (__atomic_echange) failed"
#endif
#if !__has_builtin (__atomic_exchange_n)
# error "__has_builtin (__atomic_exchange_n) failed"
#endif
// Verify a few sync built-ins.
#if !__has_builtin (__sync_fetch_and_add)
# error "__has_builtin (__sync_fetch_and_add) failed"
#endif
#if !__has_builtin (__sync_add_and_fetch)
# error "__has_builtin (__sync_add_and_fetch) failed"
#endif
#if !__has_builtin (__sync_bool_compare_and_swap)
# error "__has_builtin (__sync_bool_compare_and_swap) failed"
#endif
#if !__has_builtin (__sync_val_compare_and_swap)
# error "__has_builtin (__sync_val_compare_and_swap) failed"
#endif
#if !__has_builtin (__sync_synchronize)
# error "__has_builtin (__sync_synchronize) failed"
#endif
// Verify nonlocal goto builtins.
#if !__has_builtin (__builtin_setjmp)
# error "__has_builtin (__builtin_setjmp) failed"
#endif
#if !__has_builtin (__builtin_longjmp)
# error "__has_builtin (__builtin_longjmp) failed"
#endif
// Verify a few built-ins for constructing function calls.
#if !__has_builtin (__builtin_apply)
# error "__has_builtin (__builtin_apply) failed"
#endif
#if !__has_builtin (__builtin_return)
# error "__has_builtin (__builtin_return) failed"
#endif
// Verify built-ins for function return address.
#if !__has_builtin (__builtin_return_address)
# error "__has_builtin (__builtin_return_address) failed"
#endif
#if !__has_builtin (__builtin_extract_return_addr)
# error "__has_builtin (__builtin_extract_return_addr) failed"
#endif
#if !__has_builtin (__builtin_frob_return_addr)
# error "__has_builtin (__builtin_frob_return_addr) failed"
#endif
#if !__has_builtin (__builtin_frame_address)
# error "__has_builtin (__builtin_frame_address) failed"
#endif
// Verify keywords that aren't declared built-in functions.
#if !__has_builtin (__builtin_has_attribute)
# error "__has_builtin (__builtin_has_attribute) failed"
#endif
#if !__has_builtin (__builtin_offsetof)
# error "__has_builtin (__builtin_offsetof) failed"
#endif
// Verify some C-only built-ins.
#if !__has_builtin (__builtin_types_compatible_p)
# if !__cplusplus
# error "__has_builtin (__builtin_types_compatible_p) failed"
# endif
#else
# if __cplusplus
# error "__has_builtin (__builtin_types_compatible_p) failed"
# endif
#endif
// Verify a few C++ traits built-ins.
#if !__has_builtin (__builtin_addressof)
# if __cplusplus
# error "__has_builtin (__builtin_addressof) failed"
# endif
#else
# if !__cplusplus
# error "__has_builtin (__builtin_addressof) failed"
# endif
#endif
#if !__has_builtin (__builtin_launder)
# if __cplusplus
# error "__has_builtin (__builtin_launder) failed"
# endif
#else
# if !__cplusplus
# error "__has_builtin (__builtin_launder) failed"
# endif
#endif
#if !__has_builtin (__has_nothrow_assign)
# if __cplusplus
# error "__has_builtin (__has_nothrow_assign) failed"
# endif
#else
# if !__cplusplus
# error "__has_builtin (__has_nothrow_assign) failed"
# endif
#endif
#if !__has_builtin (__has_trivial_assign)
# if __cplusplus
# error "__has_builtin (__has_trivial_assign) failed"
# endif
#else
# if !__cplusplus
# error "__has_builtin (__has_trivial_assign) failed"
# endif
#endif
#if !__has_builtin (__has_virtual_destructor)
# if __cplusplus
# error "__has_builtin (__has_virtual_destructor) failed"
# endif
#else
# if !__cplusplus
# error "__has_builtin (__has_virtual_destructor) failed"
# endif
#endif
// Verify an Intel built-in that's not implemented by any other target.
#if !__has_builtin (__builtin_ia32_pause)
# if defined (__i386__) || defined (__x86_64__)
# error "__has_builtin (__builtin_ia32_pause) failed"
# endif
#else
# if !defined (__i386__) && !defined (__x86_64__)
# error "__has_builtin (__builtin_ia32_pause) failed"
# endif
#endif
// Verify non-functions.
#if __has_builtin (__alignof__)
# error "__has_builtin (__alignof__) failed"
#endif
#if __has_builtin (asm)
# error "__has_builtin (asm) failed"
#endif
#if __has_builtin (__asm__)
# error "__has_builtin (__asm__) failed"
#endif
#if __has_builtin (__attribute__)
# error "__has_builtin (__attribute__) failed"
#endif
#if __has_builtin (__inline__)
# error "__has_builtin (__inline__) failed"
#endif
#if __has_builtin (__typeof__)
# error "__has_builtin (__typeof__) failed"
#endif