blob: 22c559e4adafea3e6c86b31c78258be9c092138c [file] [log] [blame]
/* 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);
}
}