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