[PATCH] D60023: [libcxx] [test] Fix inability to rebind poca_alloc in string.cons/copy_alloc.pass.cpp.
Billy Robert O'Neal III via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 29 19:02:52 PDT 2019
BillyONeal created this revision.
BillyONeal added reviewers: EricWF, ldionne, mclow.lists.
BillyONeal added a project: libc++.
Herald added subscribers: jdoerfert, dexonsmith.
copy_alloc.pass.cpp contains an allocator that tries to be rebindable; but if it actually does that it fails because the alloc_imp type is not rebindable (so you get failure to compile because alloc_imp<T>* isn't convertible to alloc_imp<U>*).
The fix is to make the members of alloc_impl templates instead of making alloc_imp itself a template.
This allows the test for MSVC++ because we need to rebind for _Container_proxy.
https://reviews.llvm.org/D60023
Files:
test/std/strings/basic.string/string.cons/copy_alloc.pass.cpp
Index: test/std/strings/basic.string/string.cons/copy_alloc.pass.cpp
===================================================================
--- test/std/strings/basic.string/string.cons/copy_alloc.pass.cpp
+++ test/std/strings/basic.string/string.cons/copy_alloc.pass.cpp
@@ -18,12 +18,12 @@
#include "min_allocator.h"
#ifndef TEST_HAS_NO_EXCEPTIONS
-template <class T>
struct alloc_imp {
bool active;
alloc_imp() : active(true) {}
+ template <class T>
T* allocate(std::size_t n)
{
if (active)
@@ -32,6 +32,7 @@
throw std::bad_alloc();
}
+ template <class T>
void deallocate(T* p, std::size_t) { std::free(p); }
void activate () { active = true; }
void deactivate() { active = false; }
@@ -42,14 +43,14 @@
typedef T value_type;
typedef std::true_type propagate_on_container_copy_assignment;
- alloc_imp<T> *imp;
+ alloc_imp *imp;
- poca_alloc(alloc_imp<T> *imp_) : imp (imp_) {}
+ poca_alloc(alloc_imp *imp_) : imp (imp_) {}
template <class U>
poca_alloc(const poca_alloc<U>& other) : imp(other.imp) {}
- T* allocate (std::size_t n) { return imp->allocate(n);}
+ T* allocate (std::size_t n) { return imp->allocate<T>(n);}
void deallocate(T* p, std::size_t n) { imp->deallocate(p, n); }
};
@@ -112,8 +113,8 @@
const char * p1 = "This is my first string";
const char * p2 = "This is my second string";
- alloc_imp<char> imp1;
- alloc_imp<char> imp2;
+ alloc_imp imp1;
+ alloc_imp imp2;
S s1(p1, A(&imp1));
S s2(p2, A(&imp2));
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D60023.192953.patch
Type: text/x-patch
Size: 1643 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190330/5ba474a9/attachment.bin>
More information about the cfe-commits
mailing list