| /* { dg-do compile } */ |
| /* { dg-options "-fgnu-tm" } */ |
| |
| void ts(void) __attribute__((transaction_safe)); |
| void tp(void) __attribute__((transaction_pure)); |
| void tc(void) __attribute__((transaction_callable)); |
| void ti(void) __attribute__((transaction_unsafe)); |
| void tm(void) __attribute__((transaction_may_cancel_outer)); |
| void tu(void); |
| int fc(int) __attribute__((const)); |
| |
| typedef void (*Fs) (void) __attribute__((transaction_safe)); |
| typedef void (*Fc) (void) __attribute__((transaction_callable)); |
| typedef void (*Fi) (void) __attribute__((transaction_unsafe)); |
| typedef void (*Fm) (void) __attribute__((transaction_may_cancel_outer)); |
| extern Fs ps; |
| extern Fc pc; |
| extern Fi pi; |
| extern Fm pm; |
| extern void (*pu)(void); |
| |
| int __attribute__((transaction_safe)) |
| foo(void) |
| { |
| int i; |
| |
| ts(); |
| tp(); |
| tc(); /* { dg-error "unsafe function call" } */ |
| ti(); /* { dg-error "unsafe function call" } */ |
| |
| /* ??? Direct function calls without markups are handled later |
| than pass_diagnose_tm_blocks, which means we'll exit with |
| errors before getting there. This test moved to safe-3.c. */ |
| /* tu(); */ |
| |
| (*ps)(); |
| (*pc)(); /* { dg-error "unsafe indirect function call" } */ |
| (*pi)(); /* { dg-error "unsafe indirect function call" } */ |
| (*pu)(); /* { dg-error "unsafe indirect function call" } */ |
| |
| asm(""); /* { dg-error "'asm' not allowed" } */ |
| asm("" : "=g"(i)); /* { dg-error "'asm' not allowed" } */ |
| |
| return fc(i); |
| } |
| |
| int __attribute__((transaction_may_cancel_outer)) |
| bar(void) |
| { |
| int i; |
| |
| ts(); |
| tp(); |
| tc(); /* { dg-error "unsafe function call" } */ |
| ti(); /* { dg-error "unsafe function call" } */ |
| tm(); |
| |
| (*ps)(); |
| (*pc)(); /* { dg-error "unsafe indirect function call" } */ |
| (*pi)(); /* { dg-error "unsafe indirect function call" } */ |
| (*pm)(); |
| (*pu)(); /* { dg-error "unsafe indirect function call" } */ |
| |
| asm(""); /* { dg-error "'asm' not allowed" } */ |
| asm("" : "=g"(i)); /* { dg-error "'asm' not allowed" } */ |
| |
| return fc(i); |
| } |