[Bug c++/16982] wrong copy ctor called
bangerth at dealii dot org
gcc-bugzilla@gcc.gnu.org
Wed Aug 11 18:12:00 GMT 2004
------- Additional Comments From bangerth at dealii dot org 2004-08-11 18:12 -------
Here's a testcase that's slightly simpler to understand:
--------------------
#include <iostream>
extern "C" void abort ();
#define WHEREAMI std::cout << __PRETTY_FUNCTION__ << std::endl
struct base {
base () {WHEREAMI;}
base (base const&) {
WHEREAMI;
abort ();
}
};
struct derived : base {
derived () { WHEREAMI; }
derived (derived const&) : base () { WHEREAMI; }
};
struct s {
operator derived () {
WHEREAMI;
return derived ();
}
};
int main () {
s s;
base const& b (s);
}
-------------------------------
With 3.4, we get this output:
g/x> ./a.out
s::operator derived()
base::base()
derived::derived()
base::base(const base&)
Aborted
In other words, the abort happens when the temporary returned from
the call to s::operator derived is casted to a reference of the base
class. I am pretty sure the compiler is allowed to do so, but don't
right now have the correct section of the standard available.
In any case, the question may be moot, since with mainline we get this:
g/x> /home/bangerth/bin/gcc-3.5-pre/bin/c++ x.cc
g/x> ./a.out
s::operator derived()
base::base()
derived::derived()
I.e. there is no abort and the program does what you expect.
W.
--
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |RESOLVED
Resolution| |FIXED
Target Milestone|--- |3.5.0
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16982
More information about the Gcc-bugs
mailing list