public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug c++/16982] New: wrong copy ctor called @ 2004-08-11 15:42 boris at kolpackov dot net 2004-08-11 16:21 ` [Bug c++/16982] " pinskia at gcc dot gnu dot org ` (2 more replies) 0 siblings, 3 replies; 4+ messages in thread From: boris at kolpackov dot net @ 2004-08-11 15:42 UTC (permalink / raw) To: gcc-bugs $ cat >test.cxx extern "C" void abort (); struct base { base () { } base (base const&) { abort (); } }; struct derived : base { derived () { } derived (derived const&) : base () { } }; struct s { operator derived () { return derived (); } }; int main () { s s; base const& b (s); } $ g++-3.4 --version g++-3.4 (GCC) 3.4.1 (Debian 3.4.1-5) $ g++-3.4 test.cxx $ ./a.out Aborted $ g++-3.3 --version g++-3.3 (GCC) 3.3.4 (Debian 1:3.3.4-7) $ g++-3.3 test.cxx $ ./a.out Aborted Here is a quote from 8.5.3/5 bullet 2, sub-bullet 1, sub-sub-bullet 2: A temporary of type cv1 T2 [sic] is created, and a constructor is called to copy the entire rvalue object into the temporary. The reference is bound to the temporary or to a subobject within the temporary. The constructor that would be used to make the copy shall be callable whether or not the copy is actually done. [Example: struct A { }; struct B : public A { } b; extern B f(); const A& rca = f(); // Either bound to the A subobject of the B rvalue, // or the entire B object is copied and the reference // is bound to the A subobject of the copy --end example] -- Summary: wrong copy ctor called Product: gcc Version: 3.4.1 Status: UNCONFIRMED Severity: normal Priority: P2 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: boris at kolpackov dot net CC: gcc-bugs at gcc dot gnu dot org GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: i686-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16982 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/16982] wrong copy ctor called 2004-08-11 15:42 [Bug c++/16982] New: wrong copy ctor called boris at kolpackov dot net @ 2004-08-11 16:21 ` pinskia at gcc dot gnu dot org 2004-08-11 16:31 ` boris at kolpackov dot net 2004-08-11 18:12 ` bangerth at dealii dot org 2 siblings, 0 replies; 4+ messages in thread From: pinskia at gcc dot gnu dot org @ 2004-08-11 16:21 UTC (permalink / raw) To: gcc-bugs ------- Additional Comments From pinskia at gcc dot gnu dot org 2004-08-11 16:21 ------- I think this is related to bug 14140. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16982 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/16982] wrong copy ctor called 2004-08-11 15:42 [Bug c++/16982] New: wrong copy ctor called boris at kolpackov dot net 2004-08-11 16:21 ` [Bug c++/16982] " pinskia at gcc dot gnu dot org @ 2004-08-11 16:31 ` boris at kolpackov dot net 2004-08-11 18:12 ` bangerth at dealii dot org 2 siblings, 0 replies; 4+ messages in thread From: boris at kolpackov dot net @ 2004-08-11 16:31 UTC (permalink / raw) To: gcc-bugs ------- Additional Comments From boris at kolpackov dot net 2004-08-11 16:31 ------- In 14140 we are talking about slice-copying (note the signature: void func(base b)). Here we are talking about reference binding. Those two cases may look alike on the source code level but they are covered by completely different parts of the standard. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16982 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/16982] wrong copy ctor called 2004-08-11 15:42 [Bug c++/16982] New: wrong copy ctor called boris at kolpackov dot net 2004-08-11 16:21 ` [Bug c++/16982] " pinskia at gcc dot gnu dot org 2004-08-11 16:31 ` boris at kolpackov dot net @ 2004-08-11 18:12 ` bangerth at dealii dot org 2 siblings, 0 replies; 4+ messages in thread From: bangerth at dealii dot org @ 2004-08-11 18:12 UTC (permalink / raw) To: gcc-bugs ------- 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 ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2004-08-11 18:12 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2004-08-11 15:42 [Bug c++/16982] New: wrong copy ctor called boris at kolpackov dot net 2004-08-11 16:21 ` [Bug c++/16982] " pinskia at gcc dot gnu dot org 2004-08-11 16:31 ` boris at kolpackov dot net 2004-08-11 18:12 ` bangerth at dealii dot org
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).