// C++26 P3144R2 - Deleting a Pointer to an Incomplete Type Should be Ill-formed
// { dg-do compile { target c++26 } }
// { dg-options "-fpermissive" }

struct S;	// { dg-message "forward declaration of 'struct S'" }
struct T;	// { dg-message "forward declaration of 'struct T'" }
struct U;	// { dg-message "forward declaration of 'struct U'" }

void
foo (S *p, T *q, U *r, S *s, T *t, U *u)
{
  delete p;	// { dg-warning "operator 'delete' used on incomplete type" }
  delete q;	// { dg-warning "operator 'delete' used on incomplete type" }
  delete r;	// { dg-warning "operator 'delete' used on incomplete type" }
  delete[] s;	// { dg-warning "operator 'delete \\\[\\\]' used on incomplete type" }
  delete[] t;	// { dg-warning "operator 'delete \\\[\\\]' used on incomplete type" }
  delete[] u;	// { dg-warning "operator 'delete \\\[\\\]' used on incomplete type" }
}

struct S
{
  int s;
};

struct T
{
  int t;
  ~T () {}
};

struct U
{
  int u;
  void operator delete (void *) noexcept;
  void operator delete[] (void *) noexcept;
};