blob: 83ea1af7056e7043463d89fc147f7b6ea3f420ab [file] [log] [blame]
/* { dg-do compile } */
/* { dg-options "-fstrub=relaxed" } */
/* { dg-require-effective-target strub } */
/* This is strub-ptrfn2.c without -Wpedantic.
Even C doesn't report the (not-quite-)compatible conversions without it. */
extern int __attribute__ ((strub ("callable"))) bac (void);
extern int __attribute__ ((strub ("disabled"))) bad (void);
extern int __attribute__ ((strub ("internal"))) bar (void);
extern int __attribute__ ((strub ("at-calls"))) bal (void);
void __attribute__ ((strub))
bap (void)
{
int __attribute__ ((strub ("disabled"))) (*d_p) (void) = bad;
int __attribute__ ((strub ("callable"))) (*c_p) (void) = bac;
int __attribute__ ((strub ("at-calls"))) (*a_p) (void) = bal;
d_p = bac;
c_p = bad;
c_p = bar;
c_p = bal; /* { dg-message "incompatible|invalid conversion" } */
a_p = bac; /* { dg-message "incompatible|invalid conversion" } */
}
void __attribute__ ((strub))
baP (void)
{
typedef int __attribute__ ((strub ("disabled"))) d_fn_t (void);
typedef int __attribute__ ((strub ("callable"))) c_fn_t (void);
typedef int __attribute__ ((strub ("at-calls"))) a_fn_t (void);
d_fn_t *d_p = bad;
c_fn_t *c_p = bac;
a_fn_t *a_p = bal;
d_p = bac;
c_p = bad;
c_p = bar;
c_p = bal; /* { dg-message "incompatible|invalid conversion" } */
a_p = bac; /* { dg-message "incompatible|invalid conversion" } */
}