/* 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);
    }
}
