Fix incorrectly qualified return type from unique_ptr::get_deleter().

For reference deleter types the const qualifier on the return type
of get_deleter() should be ignored, and a non-const deleter should
be returned.

This patch fixes a bug where "const deleter_type&" is incorrectly
formed.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@300121 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Fiselier
2017-04-12 22:43:49 +00:00
parent 6d5fdc110f
commit 39683f1377
4 changed files with 73 additions and 31 deletions

View File

@@ -15,23 +15,42 @@
#include <memory>
#include <cassert>
#include "test_macros.h"
struct Deleter
{
void operator()(void*) {}
struct Deleter {
void operator()(void*) const {}
int test() {return 5;}
int test() const {return 6;}
int test() { return 5; }
int test() const { return 6; }
};
int main()
{
{
int main() {
{
std::unique_ptr<int[], Deleter> p;
assert(p.get_deleter().test() == 5);
}
{
}
{
const std::unique_ptr<int[], Deleter> p;
assert(p.get_deleter().test() == 6);
}
}
{
typedef std::unique_ptr<int[], const Deleter&> UPtr;
const Deleter d;
UPtr p(nullptr, d);
const UPtr& cp = p;
ASSERT_SAME_TYPE(decltype(p.get_deleter()), const Deleter&);
ASSERT_SAME_TYPE(decltype(cp.get_deleter()), const Deleter&);
assert(p.get_deleter().test() == 6);
assert(cp.get_deleter().test() == 6);
}
{
typedef std::unique_ptr<int[], Deleter&> UPtr;
Deleter d;
UPtr p(nullptr, d);
const UPtr& cp = p;
ASSERT_SAME_TYPE(decltype(p.get_deleter()), Deleter&);
ASSERT_SAME_TYPE(decltype(cp.get_deleter()), Deleter&);
assert(p.get_deleter().test() == 5);
assert(cp.get_deleter().test() == 5);
}
}

View File

@@ -15,23 +15,42 @@
#include <memory>
#include <cassert>
#include "test_macros.h"
struct Deleter
{
void operator()(void*) {}
struct Deleter {
void operator()(void*) const {}
int test() {return 5;}
int test() const {return 6;}
int test() { return 5; }
int test() const { return 6; }
};
int main()
{
{
int main() {
{
std::unique_ptr<int, Deleter> p;
assert(p.get_deleter().test() == 5);
}
{
}
{
const std::unique_ptr<int, Deleter> p;
assert(p.get_deleter().test() == 6);
}
}
{
typedef std::unique_ptr<int, const Deleter&> UPtr;
const Deleter d;
UPtr p(nullptr, d);
const UPtr& cp = p;
ASSERT_SAME_TYPE(decltype(p.get_deleter()), const Deleter&);
ASSERT_SAME_TYPE(decltype(cp.get_deleter()), const Deleter&);
assert(p.get_deleter().test() == 6);
assert(cp.get_deleter().test() == 6);
}
{
typedef std::unique_ptr<int, Deleter&> UPtr;
Deleter d;
UPtr p(nullptr, d);
const UPtr& cp = p;
ASSERT_SAME_TYPE(decltype(p.get_deleter()), Deleter&);
ASSERT_SAME_TYPE(decltype(cp.get_deleter()), Deleter&);
assert(p.get_deleter().test() == 5);
assert(cp.get_deleter().test() == 5);
}
}