/* Verify __builtin_has_attribute return value for i386 function attributes. { dg-do compile } { dg-options "-Wall -ftrack-macro-expansion=0" } { dg-options "-Wall -Wno-narrowing -Wno-unused -ftrack-macro-expansion=0" { target c++ } } */ #define ATTR(...) __attribute__ ((__VA_ARGS__)) #define A(expect, sym, attr) \ typedef int Assert [1 - 2 * !(__builtin_has_attribute (sym, attr) == expect)] void fnone (void); ATTR (interrupt) void finterrupt (void*); ATTR (interrupt, naked) void fnaked_interrupt (void*); A (0, fnone, interrupt); A (1, finterrupt, interrupt); A (1, fnaked_interrupt, interrupt); A (1, fnaked_interrupt, naked); ATTR (naked) void fnaked (void); A (0, fnone, naked); A (1, fnaked, naked); ATTR (no_caller_saved_registers) void fnsr (int); A (0, fnone, no_caller_saved_registers); A (1, fnsr, no_caller_saved_registers); ATTR (target ("abm")) void ftarget_abm (void); ATTR (target ("mmx")) void ftarget_mmx (void); ATTR (target ("mmx"), target ("sse")) void ftarget_mmx_sse (void); A (0, fnone, target); A (0, fnone, target ("abm")); A (0, fnone, target ("mmx")); A (1, ftarget_abm, target); A (0, ftarget_abm, target ("no-abm")); A (1, ftarget_abm, target ("abm")); A (1, ftarget_mmx, target); A (0, ftarget_mmx, target ("no-mmx")); A (1, ftarget_mmx, target ("mmx")); A (1, ftarget_mmx_sse, target); A (0, ftarget_mmx_sse, target ("no-mmx")); A (1, ftarget_mmx_sse, target ("mmx")); A (1, ftarget_mmx_sse, target ("sse"));