------- Additional Comments From giovannibajo at libero dot it 2004-10-13 14:21 ------- Slightly cleaned-up testcase:
-------------------------------------------------- extern "C" int printf(const char* fmt, ...); extern "C" void abort(void); struct A { A() {} A(const A&) { printf("A cctor\n"); } }; struct B : public A { B() {} B(const B&) { printf("B cctor\n"); abort(); } }; struct Wrapper { B* b; Wrapper(B* b_) : b(b_) {} B& operator*() const {return *b;} operator B&() const {return **this;} }; void func(A a) {} // Takes the parameter by value int main() { B b; Wrapper b_wrap(&b); printf("\nCalling 'func(b)':\n"); func(b); printf("\nCalling 'func(*b_wrap)':\n"); func(*b_wrap); printf("\nCalling 'func(b_wrap)':\n"); func(b_wrap); return 0; } -------------------------------------------------- In short, this should not abort, and does not with ICC, Comeau, or MSVC. This is a regression since 2.95 appeared with 3.0. -- What |Removed |Added ---------------------------------------------------------------------------- Severity|normal |critical Known to fail|3.3.3 3.2.3 3.4.0 4.0.0 |3.0.4 3.3.3 3.2.3 3.4.0 | |4.0.0 Known to work| |2.95.3 Summary|Unwanted call to derived |[3.3/3.4/4.0 Regression] |constructor after implicit |Unwanted call to derived |conversion |constructor after implicit | |conversion Target Milestone|--- |3.4.3 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14140