EricWF requested changes to this revision.
EricWF added a comment.
This revision now requires changes to proceed.

I don't think this patch is correct or desirable any longer.

I think what we should do is throw an exception right away if 
`__is_overaligned_for_new(align)`, and not even try to allocate. The behavior 
is quite surprising anyway. If new *happens* to return correctly aligned 
memory, then the call spuriously succeeds seemingly at random.



================
Comment at: src/experimental/memory_resource.cpp:29
+static bool is_aligned_to(void *ptr, size_t align)
+{
+    void *p2 = ptr;
----------------
Quuxplusone wrote:
> EricWF wrote:
> > Wait, can't this be written `reinterpret_cast<uintptr_t>(ptr) % align == 0`?
> Yes on sane platforms, but that's technically implementation-defined 
> behavior: the low bits of the uintptr_t may not correspond to the "alignment" 
> of the original pointer (for example, on some hypothetical tagged-pointer 
> architecture?). I don't know if libc++ cares about those platforms, but it 
> seems like `std::align` was added specifically to solve this problem in a 
> portable way, so I thought it would be best to use it.
> 
> If you reply and say "yeah but please change it anyway," I'll change it 
> anyway. :)
Please change it anyway. This isn't what `std::align` was meant to do. Plus 
`std::align` suffers from the same problems.


================
Comment at: src/experimental/memory_resource.cpp:49
+        if (!is_aligned_to(result, align)) {
+            _VSTD::__libcpp_deallocate(result, bytes, align);
+            __throw_bad_alloc();
----------------
Oh boy... God knows if this call is correct since the value it's passing for 
`align` doesn't match the pointers alignment.


================
Comment at: src/experimental/memory_resource.cpp:59
+
+    bool do_is_equal(const memory_resource& other) const _NOEXCEPT override
+        { return &other == this; }
----------------
These whitespace/naming changes are unrelated.


================
Comment at: src/experimental/memory_resource.cpp:68
 {
-public:
-    ~__null_memory_resource_imp() = default;
-
-protected:
-    virtual void* do_allocate(size_t, size_t) {
-        __throw_bad_alloc();
-    }
-    virtual void do_deallocate(void *, size_t, size_t) {}
-    virtual bool do_is_equal(memory_resource const & __other) const _NOEXCEPT
-    { return &__other == this; }
+    void *do_allocate(size_t, size_t) override { __throw_bad_alloc(); }
+    void do_deallocate(void *, size_t, size_t) override {}
----------------
These changes are all unrelated. 


Repository:
  rCXX libc++

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D47344/new/

https://reviews.llvm.org/D47344



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to