| /* Exercise basic C++-only cases of -Wdangling-pointer. |
| { dg-do compile } |
| { dg-options "-Wall -Wno-class-memaccess" } */ |
| |
| extern "C" void* memset (void*, int, __SIZE_TYPE__); |
| |
| void sink (const void*, ...); |
| |
| struct S { S (); }; |
| |
| void nowarn_int_ref (int i) |
| { |
| const S &sref = S (); |
| const int &iref = 1 + i; |
| sink (&sref, &iref); |
| } |
| |
| void warn_init_ref_member () |
| { |
| struct AS |
| { |
| const S &sref; |
| AS (): |
| // The temporary S object is destroyed when AS::AS() returns. |
| sref (S ()) // { dg-warning "storing the address" } |
| { } |
| } as; |
| |
| struct Ai |
| { |
| const int &iref; |
| Ai (): |
| // The temporary int is destroyed when Ai::Ai() returns. |
| iref (1 + 1) // { dg-warning "storing the address" } |
| { } |
| } ai; |
| |
| sink (&as, &ai); |
| } |
| |
| |
| void default_ref_arg (const S& = S ()); |
| |
| void nowarn_call_default_ref_arg () |
| { |
| default_ref_arg (); |
| } |
| |
| |
| void nowarn_array_access () |
| { |
| /* Verify that the clobber in the exceptional basic block doesn't |
| cause bogus warnings. */ |
| S a[1]; |
| memset (a, 0, sizeof a); |
| sink (a); |
| } |
| |
| |
| void nowarn_array_access_cond (int i) |
| { |
| if (i) |
| { |
| S a1[1]; |
| memset (a1, 0, sizeof a1); |
| sink (a1); |
| } |
| else |
| { |
| S a2[2]; |
| memset (a2, 0, sizeof a2); |
| sink (a2); |
| } |
| } |