================
@@ -595,6 +595,10 @@ struct GH99278_2 {
   } f;
 };
 GH99278_2<void> e;
+void GH99278_3(int(*p)[]) {
+  delete p;
+  // expected-warning@-1 {{'delete' applied to a pointer-to-array type 'int 
(*)[]' treated as 'delete[]'}}
+};
----------------
hvdijk wrote:

> The general issue here is that there's a hole in the standard: a non-array 
> new-expression can't return a pointer to an array, so [expr.delete]p2 
> effectively says it's always undefined behavior to delete a pointer to an 
> array (unless it's null).

True for the tests that I added with `delete`. For your example with 
`delete[]`, consider:

```c++
struct S { ~S(); };
void del(S(*p)[]) { delete[] p; }
void test() { del(new S[4][4]); }
```

The checks that I implemented in this PR handle this, they allow it in that 
test, but reject it if `S` is incomplete which is necessary to avoid UB.

The codegen crash is worrying, the test I'm showing here shows that this can 
occur in legitimate code. I'll have a look at that when I have some extra time.

https://github.com/llvm/llvm-project/pull/149406
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to