[PATCH] D21320: Alternative to D1332

Eric Fiselier via cfe-commits cfe-commits at lists.llvm.org
Tue Jun 14 14:10:12 PDT 2016


EricWF added a comment.

If we choose to special case this I think we *need* to do it with a new specialization of `default_delete<T[N]>`, not using the primary template.

The primary templates defines `default_delete<T[N]>::pointer` as `T*[N]`, which `T*` will not convert to. That means this patch still rejects things like `default_delete<int[5]>{}(new int[5])`  and `unique_ptr<int[5]>(new int[5])` which should obviously work if we support this.

The new specialization should instead act in the same way as `default_delete<T[]>` and define `pointer` to be `T*`.  Only after doing this do we end up with something useful.

However, We are *NOT* fixing previously buggy code. This is a pure extension. Nobody is running into bugs caused by `default_delete<T[N]>` calling the wrong delete method on *non-null* pointers, because only  null  literals convert to the pointer type`T*[N]`.  Non-null pointers returned from `new` or `malloc`  require a `reinterpret_cast<Delete::pointer>(p)` before they can be passed to the deleter. If they don't do this they will get a compile error.

IMHO instead of trying to make this work, we should diagnose it as early as possible.  Any code that uses default_delete<T[N]> is going to run into a compile error pretty quickly so, we might as well make it a pretty one.

Anyway thats my 2 cents. I'll be quite now.


http://reviews.llvm.org/D21320





More information about the cfe-commits mailing list