This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/63717] New: Value-initialization performs defaut-initialization when =default is outside the class declaration
- From: "morwenn29 at hotmail dot fr" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sun, 02 Nov 2014 22:50:51 +0000
- Subject: [Bug c++/63717] New: Value-initialization performs defaut-initialization when =default is outside the class declaration
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63717
Bug ID: 63717
Summary: Value-initialization performs defaut-initialization
when =default is outside the class declaration
Product: gcc
Version: 4.9.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: morwenn29 at hotmail dot fr
I have this minimal test case:
struct foo
{
unsigned value;
foo();
foo(unsigned value):
value(value)
{}
};
foo::foo()
= default;
int main()
{
foo bar{};
}
In this test case, foo bar{}; should zero-initialize bar and thus
zero-initialize value (see http://stackoverflow.com/q/26699720/1364752 for a
discussion about that). However, value is sometimes initialized with garbage
instead of being initialized with 0. Here is the assembly produced by the
example above:
push %ebp
mov %esp,%ebp
and $0xfffffff0,%esp
sub $0x10,%esp
call 0x402060 <__main>
lea 0xc(%esp),%eax
mov %eax,%ecx
call 0x401610 <foo::foo()>
mov $0x0,%eax
leave
ret
As you can see, the default constructor of foo is called, but value is not
zero-initialized here. However, if we move = default in the class declaration:
struct foo
{
unsigned value;
foo() = default;
foo(unsigned value):
value(value)
{}
};
foo::foo()
= default;
int main()
{
foo bar{};
}
Then, the produced assembly is not the same anymore and value is properly
zero-initialized as expected:
push %ebp
mov %esp,%ebp
and $0xfffffff0,%esp
sub $0x10,%esp
call 0x402050 <__main>
movl $0x0,0xc(%esp) ; init value (?)
mov $0x0,%eax
leave
ret
I am not really good at reading assembly but I fixed my problem by moving the
=default into the class instead separating the declaration of the default
constructor and its definition. If I correctly read both the standard and the
assembly, I am pretty sure that this is a GCC bug.