diff options
Diffstat (limited to 'gcc-4.9/gcc/testsuite/c-c++-common/tm/safe-1.c')
-rw-r--r-- | gcc-4.9/gcc/testsuite/c-c++-common/tm/safe-1.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tm/safe-1.c b/gcc-4.9/gcc/testsuite/c-c++-common/tm/safe-1.c new file mode 100644 index 000000000..b2a435305 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tm/safe-1.c @@ -0,0 +1,69 @@ +/* { 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 function call" } */ + (*pi)(); /* { dg-error "unsafe function call" } */ + (*pu)(); /* { dg-error "unsafe 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 function call" } */ + (*pi)(); /* { dg-error "unsafe function call" } */ + (*pm)(); + (*pu)(); /* { dg-error "unsafe function call" } */ + + asm(""); /* { dg-error "asm not allowed" } */ + asm("" : "=g"(i)); /* { dg-error "asm not allowed" } */ + + return fc(i); +} |