#include <stdlib.h>

struct ptr_wrapper
{
  int *ptr;
};

struct ptr_wrapper
test_1 (void)
{
  struct ptr_wrapper r;
  r.ptr = malloc (sizeof (int));
  return r;
}

struct ptr_wrapper
test_2 (void)
{
  struct ptr_wrapper r, s;
  r.ptr = malloc (sizeof (int));
  s = r;
  return s;
}

struct nested
{
  struct ptr_wrapper w;
};

struct nested
test_3 (void)
{
  struct nested n;
  n.w.ptr = malloc (sizeof (int));
  return n;
}

void test_4 (void)
{
  struct ptr_wrapper r;
  r.ptr = malloc (sizeof (int)); /* { dg-message "allocated here" } */
} /* { dg-warning "leak of 'r.ptr'" } */
/* { dg-bogus "leak of '<unknown>'" "unknown leak" { target *-*-* } .-1 } */

static struct ptr_wrapper __attribute__((noinline))
called_by_test_5a (void)
{
  struct ptr_wrapper r;
  r.ptr = malloc (sizeof (int)); /* { dg-message "allocated here" } */
  return r;
}

void test_5a (void)
{
  struct ptr_wrapper q = called_by_test_5a ();  
} /* { dg-warning "leak of 'q.ptr'" } */

static struct ptr_wrapper __attribute__((noinline))
called_by_test_5b (void)
{
  struct ptr_wrapper r;
  r.ptr = malloc (sizeof (int));
  return r; /* { dg-warning "leak of '<return-value>.ptr'" } */
  /* TODO: show the allocation point; improve above message.  */
}

void test_5b (void)
{
  called_by_test_5b ();
}
