blob: a9c49bd704c4eb8d84c41aede87d99fe8ffacfd7 [file] [log] [blame]
/* PR middle-end/88546 - Copy attribute unusable for weakrefs
Verify that attribute noreturn (represented as volatile on function
decls) is interpreted correctly and doesn't affect variables.
{ dg-do compile }
{ dg-options "-O1 -Wall -fdump-tree-optimized" }*/
#define ATTR(...) __attribute__ ((__VA_ARGS__))
#define ASRT(expr) _Static_assert (expr, #expr)
ATTR (noreturn) void fnoreturn (void);
ATTR (copy (fnoreturn)) void fnoreturn_copy (void);
ASRT (__builtin_has_attribute (fnoreturn_copy, noreturn));
int call_fnoreturn_copy (void)
{
fnoreturn_copy ();
fnoreturn_copy (); // should be eliminated
}
// { dg-final { scan-tree-dump-times "fnoreturn_copy \\(\\);" 1 "optimized" } }
_Noreturn void f_Noreturn (void);
ATTR (copy (f_Noreturn)) void f_Noreturn_copy (void);
ASRT (__builtin_has_attribute (f_Noreturn_copy, noreturn));
int call_f_Noreturn_copy (void)
{
f_Noreturn_copy ();
f_Noreturn_copy (); // should be eliminated
}
// { dg-final { scan-tree-dump-times "f_Noreturn_copy \\(\\);" 1 "optimized" } }
// Verify the combination of both is accepted and works too,
// just for fun.
ATTR (noreturn) _Noreturn void fnoreturn_Noreturn (void);
ATTR (copy (fnoreturn_Noreturn)) void fnoreturn_Noreturn_copy (void);
ASRT (__builtin_has_attribute (fnoreturn_Noreturn_copy, noreturn));
int call_fnoreturn_Noreturn_copy (void)
{
fnoreturn_Noreturn_copy ();
fnoreturn_Noreturn_copy (); // should be eliminated
}
// { dg-final { scan-tree-dump-times "fnoreturn_Noreturn_copy \\(\\);" 1 "optimized" } }
typedef void func_t (void);
ATTR (noreturn) func_t func_noreturn;
ATTR (copy (func_noreturn)) func_t func_noreturn_copy;
ASRT (__builtin_has_attribute (func_noreturn_copy, noreturn));
int call_func_noreturn_copy (void)
{
func_noreturn_copy ();
func_noreturn_copy (); // should be eliminated
}
// { dg-final { scan-tree-dump-times "func_noreturn_copy \\(\\);" 1 "optimized" } }
// Finally, verify that the volatile bit isn't copied for variables.
extern volatile int vi;
int read_nonvolatile (void)
{
ATTR (copy (vi)) int i = 0;
return i + i; // should be folded to return 0;
}
// { dg-final { scan-tree-dump-times "return 0;" 1 "optimized" } }