// Origin: Peter Schmid // { dg-do link } template class Ptr { protected: T * ptr; public: Ptr(void) : ptr(0) { } Ptr(T * p) : ptr(p) { } ~Ptr(void) { delete ptr; } operator T & () { return *ptr; } }; class base { public: base(void) { } ~base(void) { } }; class foo : public base { private: foo(const foo & rv); public: foo(void) { } ~foo(void) { } }; void func2(base & b) { // ... } int main () { Ptr f = new foo; /* This should not result in a copy; the result of the conversion operator should be bound directly to the reference argument to `func2'. */ func2(f); }