(root)/
gcc-13.2.0/
gcc/
testsuite/
g++.dg/
warn/
Wfree-nonheap-object-6.C
/* { dg-do compile }
   { dg-options "-O0 -Wall -Wno-dangling-pointer -Wno-return-local-address" } */

#if __cplusplus < 201103L
# define noexcept throw ()
#endif

void* operator new (__SIZE_TYPE__, void* __p) noexcept;
void operator delete (void*, void*);

void* operator new[] (__SIZE_TYPE__, void* __p) noexcept;
void operator delete[] (void*, void*) noexcept;

struct A { A (); ~A (); int i; };

extern void *p;

void nowarn_placement_new ()
{
  char a[sizeof (A)];
  /* The store to the global p might trigger -Wdangling pointer or
     -Wreturn-local-address (if/when it runs without optimization).  */
  p = new (a) A ();           // { dg-bogus "-Wfree-nonheap-object" }
}


void warn_placement_new ()
{
  char a[sizeof (A)];
  p = new (a + 1) A ();       // { dg-warning "\\\[-Wplacement-new" }
                              // { dg-bogus "-Wfree-nonheap-object" "bogus" { target *-*-* } .-1 }
}


void nowarn_placement_new_array ()
{
  char a[sizeof (A)];
  p = new (a) A[1];           // { dg-bogus "-Wfree-nonheap-object" }
}


void warn_placement_new_array ()
{
  char a[sizeof (A)];
  p = new (a + 1) A[1];       // { dg-warning "\\\[-Wplacement-new" }
                              // { dg-bogus "-Wfree-nonheap-object" "bogus" { target *-*-* } .-1 }
}