/* { 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);
}
