Viewing file: attr-copy-7.c (2.16 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* 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" } }
|