From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30311 invoked by alias); 11 Feb 2009 09:23:22 -0000 Received: (qmail 30301 invoked by uid 22791); 11 Feb 2009 09:23:21 -0000 X-SWARE-Spam-Status: No, hits=-0.4 required=5.0 tests=AWL,BAYES_05,J_CHICKENPOX_42 X-Spam-Check-By: sourceware.org Received: from mail.rapidm.com (HELO mail.rapidm.com) (196.37.169.154) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 11 Feb 2009 09:23:15 +0000 Received: from rm70 (rm70.rapidm.com [192.168.0.70]) by mail.rapidm.com (8.12.8/8.12.8) with ESMTP id n1B9N2TD021404 for ; Wed, 11 Feb 2009 11:23:07 +0200 From: "Manfred von Willich \(RapidM\)" To: Subject: (withdraw) GCC bug: Inappropriate implicit invocation of copy constructor when reference parameter is a temporary Date: Wed, 11 Feb 2009 09:23:00 -0000 Message-ID: <001801c98c2a$515accb0$4600a8c0@RAPIDM.COM> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2009-02/txt/msg00958.txt.bz2 Please ignore my previously sent email below. I see it is a "non bug", despite the utter insanity behind the rationale for it... Manfred von Willich ________________________________ Contractor RapidM Fax E-mail Web : +27 (12) 349-0000 : +27 (12) 349-0010 : manfredvw@rapidm.com : www.rapidm.com -----Original Message----- From: Manfred von Willich (RapidM) [mailto:manfredvw@rapidm.com] Sent: 03 February 2009 14:17 To: 'gcc-bugs@gcc.gnu.org' Subject: GCC bug: Inappropriate implicit invocation of copy constructor when reference parameter is a temporary I believe this is a genuine GCC compiler bug (in both GCC 4.1.1 and GCC 4.2.4). I hope this report is of value, and certainly hope it can be corrected. Forgive me for not logging a bug via http://gcc.gnu.org/bugzilla/ - I don't want to mess around with your system due to unfamiliarity with Bugzilla. Please email me directly if you wish. Manfred ====================================== Description of presumed bug: When a temporary is passed as a reference parameter, the copy constructor of the source object type is apparently invoked without reason. This is evidenced by a "no matching function" error message if there is no valid copy constructor. If the actual parameter is not a temporary, this does not occur. My take: It should be possible to pass a reference of a temporary to a function even when the class has no copy semantics, and there is no call for invoking a copy constructor in this context. Additional observations: If the function expects a reference to a base class, the message refers to the class of the temporary, to the expected reference type. This, if X is publicly derived from B and f expects a reference to B, the message still refers to 'X::X(X)' and not to B. If the copy constructor is public and implicitly callable, the message no longer appears. This is not to be confused with the same message being generated when the copy constructor must be available for returning an object from a function (e.g. http://gcc.gnu.org/ml/gcc/2005-05/msg00916.html). Example of code (test.cpp) that triggers the bug: class X { private: explicit X (X const &); // suppress copy constructor public: X () { } }; void f (X const &) { } void g () { f(X()); // error reported: "no matching function for call to 'X::X(X)'" } Compiler details: $ gcc -v -save-temps test.cpp Using built-in specs. Target: i486-linux-gnu Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu Thread model: posix gcc version 4.2.4 (Ubuntu 4.2.4-1ubuntu3) /usr/lib/gcc/i486-linux-gnu/4.2.4/cc1plus -E -quiet -v -D_GNU_SOURCE test.cpp -mtune=generic -fpch-preprocess -o test.ii ignoring nonexistent directory "/usr/local/include/i486-linux-gnu" ignoring nonexistent directory "/usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../i486-linux-gnu/include" ignoring nonexistent directory "/usr/include/i486-linux-gnu" #include "..." search starts here: #include <...> search starts here: /usr/include/c++/4.2 /usr/include/c++/4.2/i486-linux-gnu /usr/include/c++/4.2/backward /usr/local/include /usr/lib/gcc/i486-linux-gnu/4.2.4/include /usr/include End of search list. /usr/lib/gcc/i486-linux-gnu/4.2.4/cc1plus -fpreprocessed test.ii -quiet -dumpbase test.cpp -mtune=generic -auxbase test -version -fstack-protector -fstack-protector -o test.s GNU C++ version 4.2.4 (Ubuntu 4.2.4-1ubuntu3) (i486-linux-gnu) compiled by GNU C version 4.2.4 (Ubuntu 4.2.4-1ubuntu3). GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: cca9b7b48c023363b938f208576b99cc test.cpp: In function \u2018void g()\u2019: test.cpp:9: error: no matching function for call to \u2018X::X(X)\u2019 $ Output files: test.s: .file "test.cpp" test.ii: # 1 "test.cpp" # 1 "" # 1 "" # 1 "test.cpp" class X { private: explicit X (X const &); public: X () { } }; void f (X const &) { } void g () { f(X()); } Alternative compiler details (same problem): >gcc -v Using built-in specs. Target: arm-unknown-elf Configured with: ../gcc-2006q3/configure --target=arm-unknown-elf --build=i686-pc-mingw32 --host=i686-pc-mingw32 --prefix=/c/gcc-build-2006q3-26/install Thread model: single gcc version 4.1.1