(root)/
gcc-13.2.0/
gcc/
testsuite/
g++.dg/
warn/
Wmismatched-new-delete-6.C
/* PR middle-end/101791 - missing warning on a mismatch between scalar
   and array forms of new and delete
   { dg-do compile }
   { dg-options "-Wall" } */

typedef __SIZE_TYPE__ size_t;

namespace std
{
#if __cplusplus >= 201703L
enum class align_val_t: size_t { };
#else
enum align_val_t { };
#endif

struct nothrow_t { };
const nothrow_t nothrow = { };

}

void* operator new (size_t);
void* operator new (size_t, std::align_val_t);
void* operator new (size_t, std::nothrow_t) throw ();
void* operator new (size_t, std::align_val_t, std::nothrow_t) throw ();

void* operator new[] (size_t);
void* operator new[] (size_t, std::align_val_t);
void* operator new[] (size_t, std::nothrow_t) throw ();
void* operator new[] (size_t, std::align_val_t, std::nothrow_t) throw ();

void operator delete (void*);
void operator delete (void*, size_t);
void operator delete (void*, std::align_val_t);
void operator delete (void*, size_t, std::align_val_t);
void operator delete (void*, std::nothrow_t) throw ();
void operator delete (void*, std::align_val_t, std::nothrow_t) throw ();

void operator delete[] (void*);
void operator delete[] (void*, size_t);
void operator delete[] (void*, std::align_val_t);
void operator delete[] (void*, size_t, std::align_val_t);
void operator delete[] (void*, std::nothrow_t) throw ();
void operator delete[] (void*, std::align_val_t, std::nothrow_t) throw ();


void sink (void*, ...);


void nowarn_scalar_scalar ()
{
  {
    int *p = new int;
    sink (p);
    delete p;
  }

  {
    int *p = new (std::align_val_t (8)) int;
    sink (p);
    delete p;
  }

  {
    int *p = new (std::nothrow) int;
    sink (p);
    delete p;
  }

  {
    int *p = new (std::align_val_t (8), std::nothrow) int;
    sink (p);
    delete p;
  }
}

void nowarn_array_array ()
{
  {
    int *p = new int[__LINE__];
    sink (p);
    delete[] p;
  }

  {
    int *p = new (std::align_val_t (8)) int[__LINE__];
    sink (p);
    delete[] p;
  }

  {
    int *p = new (std::nothrow) int[__LINE__];
    sink (p);
    delete[] p;
  }

  {
    int *p = new (std::align_val_t (8), std::nothrow) int[__LINE__];
    sink (p);
    delete[] p;
  }
}



void nowarn_scalar_array ()
{
  {
    int *p = new int;   // { dg-message "returned from" }
    sink (p);
    delete[] p;         // { dg-warning "\\\[-Wmismatched-new-delete" }
  }

  {
    int *p = new (std::align_val_t (8)) int;
    sink (p);
    delete[] p;         // { dg-warning "\\\[-Wmismatched-new-delete" }
  }

  {
    int *p = new (std::nothrow) int;
    sink (p);
    delete[] p;         // { dg-warning "\\\[-Wmismatched-new-delete" }
  }

  {
    int *p = new (std::align_val_t (8), std::nothrow) int;
    sink (p);
    delete[] p;         // { dg-warning "\\\[-Wmismatched-new-delete" }
  }
}


void nowarn_array_scalar ()
{
  {
    int *p = new int[__LINE__];
    sink (p);
    delete p;           // { dg-warning "\\\[-Wmismatched-new-delete" }
  }

  {
    int *p = new (std::align_val_t (8)) int[__LINE__];
    sink (p);
    delete p;           // { dg-warning "\\\[-Wmismatched-new-delete" }
  }

  {
    int *p = new (std::nothrow) int[__LINE__];
    sink (p);
    delete p;           // { dg-warning "\\\[-Wmismatched-new-delete" }
  }

  {
    int *p = new (std::align_val_t (8), std::nothrow) int[__LINE__];
    sink (p);
    delete p;           // { dg-warning "\\\[-Wmismatched-new-delete" }
  }
}