blob: d475cd5810312b970fce24c5099cb08ac55ada2f [file] [log] [blame]
/* PR middle-end/88546 - Copy attribute unusable for weakrefs
{ dg-do compile }
{ dg-options "-O1 -Wall -fdump-tree-optimized" }
{ dg-require-weak "" } */
#define ATTR(...) __attribute__ ((__VA_ARGS__))
#define ASRT(expr) _Static_assert (expr, #expr)
extern "C" {
ATTR (leaf, nothrow) int
fnothrow ()
{
return 0;
}
static __typeof__ (fnothrow)
ATTR (weakref ("fnothrow"), copy (fnothrow))
alias_fnothrow;
ATTR (leaf) int
fthrow_none () throw ()
{
return 0;
}
// Verify that no warning is issued for the alias having less
// restrictive attributes than the target: nothrow.
static __typeof (fthrow_none)
ATTR (weakref ("fthrow_none"), copy (fthrow_none))
alias_fthrow_none;
// Same as above but with no definition of the target.
ATTR (leaf) int
fthrow_none_nodef () throw ();
static __typeof (fthrow_none_nodef)
ATTR (weakref ("fthrow_none_nodef"), copy (fthrow_none_nodef))
alias_fthrow_none_nodef;
// And again but without using typeof to make sure the nothrow
// bit is copied by attribute copy alone.
static int
ATTR (weakref ("fthrow_none_nodef"), copy (fthrow_none_nodef))
alias_fthrow_none_nodef_func ();
}
struct UsrClass
{
~UsrClass ();
};
// Verify that the nothrow attribute/bit was copied to the alias and
// that no exception handling code is emitted in any of these calls.
int call_alias_fnothrow ()
{
UsrClass usr;
return alias_fnothrow ();
}
int call_alias_fthrow_none ()
{
UsrClass usr;
return alias_fthrow_none ();
}
int call_alias_fthrow_none_nodef ()
{
UsrClass usr;
return alias_fthrow_none_nodef ();
}
int call_alias_fthrow_none_nodef_func ()
{
UsrClass usr;
return alias_fthrow_none_nodef_func ();
}
// { dg-final { scan-tree-dump-not "__builtin_unwind" "optimized" } }