| /* 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 |