http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48635

--- Comment #8 from Daniel Krügler <daniel.kruegler at googlemail dot com> 
2011-04-17 20:12:09 UTC ---
(In reply to comment #7)
> Ok... Do we have testcases for that?

I have two test cases for the *assignment* situation, I invented them out of my
head and I hope the code below does not too many typos and thinkos:

1) This program should be well-formed according to FDIS wording, but ill-formed
according to the intended wording:

#include <memory>
#include <utility>

struct D;

struct B {
 B& operator=(D&) = delete;
 template<class T>
   void operator()(T*) const {}
};

struct D : B {};

int main()
{
 B b;
 D d;
 std::unique_ptr<void, B&> ub(nullptr, b);
 std::unique_ptr<void, D&> ud(nullptr, d);
 ub = std::move(ud); // Should be rejected
}

2) The same scenario here:

struct D2;

struct B2 {
 B2& operator=(D2&) = delete;
 template<class T>
   void operator()(T*) const {}
};

struct D2 {
 B2 b;
 operator B2&() { return b; }
 template<class T>
   void operator()(T*) const {}
};

int main()
{
 B2 b;
 D2 d;
 std::unique_ptr<void, B2&> ub(nullptr, b);
 std::unique_ptr<void, D2&> ud(nullptr, d);
 ub = std::move(ud); // Should be rejected
}

> By the way, I noticed that in the templated *constructor* we have been using D
> instead of E in the forward, and that doesn't seem correct vs the FDIS itself.
> What do you think? The below regtests fine:

I agree that the suggested fixes are necessary and they look correct to me.

Reply via email to