| /* 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" } } |