[Bug c++/66632] New: Incorrect use of default constructor to initialize isolated rvalue.

jasonxbell at gmail dot com gcc-bugzilla@gcc.gnu.org
Mon Jun 22 23:51:00 GMT 2015


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66632

            Bug ID: 66632
           Summary: Incorrect use of default constructor to initialize
                    isolated rvalue.
           Product: gcc
           Version: 4.9.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jasonxbell at gmail dot com
  Target Milestone: ---

Created attachment 35828
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=35828&action=edit
Preprocessed source file

In the following code, the first statement in main() -- 'Q(S1v1)' -- creates an
isolated rvalue; g++ uses the default constructor to initialize it instead of
'Q::Q(S1 x)'. The lvalue q1 is then init'd via copy of the (incorrectly init'd)
rvalue from the previous statement.


bug2.c:
--------------------------------------------------------------------------------
#include <iostream>
using std::cout;
using std::ostream;

enum S1 { S1v0 = 0, S1v1= 10, S1v2, S1v3 };


class Q
{
public:
           Q()               : mySN(nextSN++), s1val(S1v0)      { cout << "+Q
#" << mySN << " Default\n"; }
           Q(const Q  &src ) : mySN(nextSN++), s1val(src.s1val) { cout << "+Q
#" << mySN << " Copy from #" << src.mySN << '\n'; }

  explicit Q(S1 x)           : mySN(nextSN++), s1val(x)         { cout << "+Q
#" << mySN << " from S1\n"; }

private:
  int mySN;
  S1 s1val;

  static int nextSN;

  friend ostream& operator<<( ostream &out, const Q &obj );

};

int Q::nextSN = 1;

ostream& operator<<( ostream &out, const Q &obj )
{
  out << "Q #" << obj.mySN << " == " << obj.s1val << '\n'; 
  return out;
}


int main( void )
{

  Q(S1v1);
  Q q2{S1v1};
  cout << '\n';

  cout << q2;

  return 0;
}
--------------------------------------------------------------------------------



Compile and run:

$ g++ -std=c++11 -pedantic -Wall -Wextra bug2.cpp; ./a.exe
+Q #1 Default
+Q #2 Copy from #1

Q #2 == 0


$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/lto-wrapper.exe
Target: x86_64-pc-cygwin
Configured with:
/cygdrive/i/szsz/tmpp/gcc/gcc-4.9.2-3.x86_64/src/gcc-4.9.2/configure
--srcdir=/cygdrive/i/szsz/tmpp/gcc/gcc-4.9.2-3.x86_64/src/gcc-4.9.2
--prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin
--libexecdir=/usr/libexec --datadir=/usr/share --localstatedir=/var
--sysconfdir=/etc --libdir=/usr/lib --datarootdir=/usr/share
--docdir=/usr/share/doc/gcc --htmldir=/usr/share/doc/gcc/html -C
--build=x86_64-pc-cygwin --host=x86_64-pc-cygwin --target=x86_64-pc-cygwin
--without-libiconv-prefix --without-libintl-prefix --libexecdir=/usr/lib
--enable-shared --enable-shared-libgcc --enable-static
--enable-version-specific-runtime-libs --enable-bootstrap --enable-__cxa_atexit
--with-dwarf2 --with-tune=generic
--enable-languages=ada,c,c++,fortran,lto,objc,obj-c++ --enable-graphite
--enable-threads=posix --enable-libatomic --enable-libgomp --disable-libitm
--enable-libquadmath --enable-libquadmath-support --enable-libssp
--enable-libada --enable-libgcj-sublibs --disable-java-awt --disable-symvers
--with-ecj-jar=/usr/share/java/ecj.jar --with-gnu-ld --with-gnu-as
--with-cloog-include=/usr/include/cloog-isl --without-libiconv-prefix
--without-libintl-prefix --with-system-zlib --enable-linker-build-id
Thread model: posix
gcc version 4.9.2 (GCC)



More information about the Gcc-bugs mailing list