Bug 55804 - [4.7/4.8 regression] GCC omits required call to constructor
Summary: [4.7/4.8 regression] GCC omits required call to constructor
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.7.3
: P3 normal
Target Milestone: 4.8.0
Assignee: Jason Merrill
URL:
Keywords: wrong-code
Depends on:
Blocks:
 
Reported: 2012-12-25 07:30 UTC by Paul Pluzhnikov
Modified: 2013-01-02 20:15 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work: 4.7.0
Known to fail: 4.7.3, 4.8.0
Last reconfirmed: 2012-12-31 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Paul Pluzhnikov 2012-12-25 07:30:10 UTC
Test case (courtesy creduce-2.0.1):

/// --- cut ---
template <typename> struct vector {
  vector() { }
};

typedef vector<int> Arrays[1];
class C
{
    vector<int> v_;
    void Foo(const Arrays &);
};
Arrays a;
/// --- cut ---


GCC-4.7 before r194286 (PR55032) was merged:

g++ -S pp.ii -o pp-good.s
c++filt < pp-good.s | grep call
	call	vector<int>::vector()
	call	__static_initialization_and_destruction_0(int, int)


Current trunk:

cat pp-bad.7765.s
	.file	"pp.ii"
	.globl	a
	.bss
	.type	a, @object
	.size	a, 1
a:
	.zero	1
	.ident	"GCC: (GNU) 4.8.0 20121222 (experimental)"
	.section	.note.GNU-stack,"",@progbits
Comment 1 Paul Pluzhnikov 2012-12-25 08:06:13 UTC
Re-confirmed with today's trunk (r194713).
Comment 2 Andrew Pinski 2012-12-31 10:19:58 UTC
Confirmed, here is a run-time testcase:
int t = 0;
template <typename> struct vector {
  vector() { t++; }
};

typedef vector<int> Arrays[1];
class C
{
    vector<int> v_;
    void Foo(const Arrays &);
};
Arrays a;

int main(void)
{
  if (t!=1)
    __builtin_abort ();
  return 0;
}
Comment 3 Jason Merrill 2013-01-02 19:03:17 UTC
Author: jason
Date: Wed Jan  2 19:03:04 2013
New Revision: 194811

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=194811
Log:
	PR c++/55804
	PR c++/55032
	PR c++/55245
	* tree.c (build_array_type_1): Revert earlier change.
	* cp/tree.c (build_cplus_array_type): Copy layout information
	to main variant if necessary.

Added:
    trunk/gcc/testsuite/g++.dg/init/array33.C
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/tree.c
    trunk/gcc/tree.c
Comment 4 Jason Merrill 2013-01-02 19:03:57 UTC
Author: jason
Date: Wed Jan  2 19:03:37 2013
New Revision: 194812

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=194812
Log:
	PR c++/55804
	PR c++/55032
	PR c++/55245
	* tree.c (build_array_type_1): Revert earlier change.
	* cp/tree.c (build_cplus_array_type): Copy layout information
	to main variant if necessary.

Added:
    branches/gcc-4_7-branch/gcc/testsuite/g++.dg/init/array33.C
Modified:
    branches/gcc-4_7-branch/gcc/ChangeLog
    branches/gcc-4_7-branch/gcc/cp/ChangeLog
    branches/gcc-4_7-branch/gcc/cp/tree.c
    branches/gcc-4_7-branch/gcc/tree.c
Comment 5 Jason Merrill 2013-01-02 19:04:10 UTC
Author: jason
Date: Wed Jan  2 19:03:46 2013
New Revision: 194813

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=194813
Log:
	PR c++/55804
	PR c++/55032
	PR c++/55245
	* tree.c (build_array_type_1): Revert earlier change.
	* cp/tree.c (build_cplus_array_type): Copy layout information
	to main variant if necessary.

Added:
    branches/gcc-4_6-branch/gcc/testsuite/g++.dg/init/array33.C
Modified:
    branches/gcc-4_6-branch/gcc/ChangeLog
    branches/gcc-4_6-branch/gcc/cp/ChangeLog
    branches/gcc-4_6-branch/gcc/cp/tree.c
    branches/gcc-4_6-branch/gcc/tree.c
Comment 6 Jason Merrill 2013-01-02 20:15:10 UTC
Fixed.