[Bug c++/52796] [4.6/4.7 C++11] Initialization of primitive object with 0-length parameter pack fails to value-initialize

jyasskin at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Mar 30 21:22:00 GMT 2012


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52796

--- Comment #1 from Jeffrey Yasskin <jyasskin at gcc dot gnu.org> 2012-03-30 21:18:09 UTC ---
Created attachment 27050
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=27050
Test file demonstrating improvement from 4.6->4.7

The attached 46_vs_47.cc shows that gcc-4.7 calls the default constructor for
pack uses like new Type(args...), while gcc-4.6 didn't. So 4.7 doesn't have the
std::list bug.  I tested this with valgrind-3.6.0:

$ g++-4.6.x --version
g++-4.6.x (GCC) 4.6.4 20120330 (prerelease)

$ g++-4.6.x -Wall -std=c++0x 46_vs_47.cc -g3 -o test && /usr/bin/valgrind
./test
...
==15840== Conditional jump or move depends on uninitialised value(s)
==15840==    at 0x4EB8074: std::ostreambuf_iterator<char,
std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char,
std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char,
std::char_traits<char> >, std::ios_base&, char, long) const
(locale_facets.tcc:872)
==15840==    by 0x4EB8395: std::num_put<char, std::ostreambuf_iterator<char,
std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char,
std::char_traits<char> >, std::ios_base&, char, long) const
(locale_facets.h:2475)
==15840==    by 0x4EC33CC: std::ostream& std::ostream::_M_insert<long>(long)
(locale_facets.h:2336)
==15840==    by 0x400BF7: void check_init<>() (46_vs_47.cc:19)
==15840==    by 0x400AC1: main (46_vs_47.cc:24)
...
0
3
==15840== Conditional jump or move depends on uninitialised value(s)
==15840==    at 0x4EB8074: std::ostreambuf_iterator<char,
std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char,
std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char,
std::char_traits<char> >, std::ios_base&, char, long) const
(locale_facets.tcc:872)
==15840==    by 0x4EB8395: std::num_put<char, std::ostreambuf_iterator<char,
std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char,
std::char_traits<char> >, std::ios_base&, char, long) const
(locale_facets.h:2475)
==15840==    by 0x4EC33CC: std::ostream& std::ostream::_M_insert<long>(long)
(locale_facets.h:2336)
==15840==    by 0x400B03: main (46_vs_47.cc:27)
...
0

$ g++-4.7pre --version
g++-4.7pre (GCC) 4.7.1 20120330 (prerelease)
$ g++-4.7pre -Wall -std=c++11 test.cc -g3 -o test && /usr/bin/valgrind ./test
==8931== Memcheck, a memory error detector
==8931== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==8931== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for
copyright info
==8931== Command: ./test
==8931== 
0
3
0



More information about the Gcc-bugs mailing list