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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user