/* { dg-do compile } */ /* Check that the foo interrupt vectors aren't actually removed. */ /* { dg-final { scan-assembler-times "__interrupt_vector_foo" 2 } } */ /* Check that the out-of-range interrupt vectors aren't actually removed. */ /* { dg-final { scan-assembler "__interrupt_vector_65" } } */ /* { dg-final { scan-assembler "__interrupt_vector_100" } } */ /* Check that warnings are emitted when attributes are used incorrectly and that attributes are interpreted correctly whether leading and trailing underscores are used or not. */ void __attribute__((__naked__,__reentrant__)) fn1(void) { /* { dg-warning "ignoring attribute 'reentrant' because it conflicts with attribute 'naked'" } */ } void __attribute__((naked,reentrant)) fn2(void) { /* { dg-warning "ignoring attribute 'reentrant' because it conflicts with attribute 'naked'" } */ } void __attribute__((__reentrant__,__naked__)) fn3(void) { /* { dg-warning "ignoring attribute 'naked' because it conflicts with attribute 'reentrant'" } */ } void __attribute__((reentrant,naked)) fn4(void) { /* { dg-warning "ignoring attribute 'naked' because it conflicts with attribute 'reentrant'" } */ } void __attribute__((__critical__,__reentrant__)) fn5(void) { /* { dg-warning "ignoring attribute 'reentrant' because it conflicts with attribute 'critical'" } */ } void __attribute__((critical,reentrant)) fn6(void) { /* { dg-warning "ignoring attribute 'reentrant' because it conflicts with attribute 'critical'" } */ } void __attribute__((__reentrant__,__critical__)) fn7(void) { /* { dg-warning "ignoring attribute 'critical' because it conflicts with attribute 'reentrant'" } */ } void __attribute__((reentrant,critical)) fn8(void) { /* { dg-warning "ignoring attribute 'critical' because it conflicts with attribute 'reentrant'" } */ } void __attribute__((__critical__,__naked__)) fn9(void) { /* { dg-warning "ignoring attribute 'naked' because it conflicts with attribute 'critical'" } */ } void __attribute__((critical,naked)) fn10(void) { /* { dg-warning "ignoring attribute 'naked' because it conflicts with attribute 'critical'" } */ } void __attribute__((__naked__,__critical__)) fn11(void) { /* { dg-warning "ignoring attribute 'critical' because it conflicts with attribute 'naked'" } */ } void __attribute__((naked,critical)) fn12(void) { /* { dg-warning "ignoring attribute 'critical' because it conflicts with attribute 'naked'" } */ } int __attribute__((interrupt)) isr1 (void) { /* { dg-warning "interrupt handlers must be void" } */ } int __attribute__((__interrupt__)) isr2 (void) { /* { dg-warning "interrupt handlers must be void" } */ } void __attribute__((interrupt("foo1"))) isr3 (void) { /* { dg-warning "unrecognized interrupt vector argument" } */ } void __attribute__((__interrupt__("foo2"))) isr4 (void) { /* { dg-warning "unrecognized.*interrupt vector argument" } */ } void __attribute__((interrupt(65))) isr5 (void) { /* { dg-warning "numeric argument of 'interrupt' attribute must be in range 0..63" } */ } void __attribute__((__interrupt__(100))) isr6 (void) { /* { dg-warning "numeric argument of 'interrupt' attribute must be in range 0..63" } */ } void __attribute__((interrupt(0.5))) isr7 (void) { /* { dg-warning "argument of 'interrupt' attribute is not a string constant or number" } */ volatile int __attribute__((__naked__)) a; /* { dg-warning "'naked' attribute only applies to functions" } */ } void __attribute__((__interrupt__(1.5))) isr8 (void) { /* { dg-warning "argument of 'interrupt' attribute is not a string constant or number" } */ volatile int __attribute__((naked)) a; /* { dg-warning "'naked' attribute only applies to functions" } */ }