diff options
author | Mark Mitchell <mark@codesourcery.com> | 2006-10-17 22:35:29 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2006-10-17 22:35:29 +0000 |
commit | c7b0e0273ea01ccc3a8b8065944f89b6d619e787 (patch) | |
tree | 69dd14ebdbf552a0333a15bf8a7c239e37f2ec70 | |
parent | 05b22df961070e926ac6bf4a8a114c5d5b1745bc (diff) | |
download | gcc-c7b0e0273ea01ccc3a8b8065944f89b6d619e787.zip gcc-c7b0e0273ea01ccc3a8b8065944f89b6d619e787.tar.gz gcc-c7b0e0273ea01ccc3a8b8065944f89b6d619e787.tar.bz2 |
re PR c++/29039 (implicitly defined constructor for class with reference member)
PR c++/29039
* typeck2.c (build_functional_cast): Don't zero-initialize
non-PODs; instead, call their constructors.
* method.c (synthesize_method): Always build mem-initializers, if
we're synthesizing the default constructor.
PR c++/29039
* g++.dg/init/ctor8.C: New test.
From-SVN: r117834
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/method.c | 2 | ||||
-rw-r--r-- | gcc/cp/typeck2.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/ctor8.C | 11 |
5 files changed, 28 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4728586..b759ba4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,13 @@ 2006-10-17 Mark Mitchell <mark@codesourcery.com> + PR c++/29039 + * typeck2.c (build_functional_cast): Don't zero-initialize + non-PODs; instead, call their constructors. + * method.c (synthesize_method): Always build mem-initializers, if + we're synthesizing the default constructor. + +2006-10-17 Mark Mitchell <mark@codesourcery.com> + PR c++/27270 * decl.c (reshape_init_class): Move check for designated to ... diff --git a/gcc/cp/method.c b/gcc/cp/method.c index e2106ff..ded0af0 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -784,7 +784,7 @@ synthesize_method (tree fndecl) tree arg_chain = FUNCTION_FIRST_USER_PARMTYPE (fndecl); if (arg_chain != void_list_node) do_build_copy_constructor (fndecl); - else if (TYPE_NEEDS_CONSTRUCTING (current_class_type)) + else finish_mem_initializers (NULL_TREE); } diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 725c85f..12987cf 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -1333,9 +1333,9 @@ build_functional_cast (tree exp, tree parms) if (parms && TREE_CHAIN (parms) == NULL_TREE) return build_c_cast (type, TREE_VALUE (parms)); - /* We need to zero-initialize POD types. Let's do that for everything - that doesn't need a constructor. */ - if (parms == NULL_TREE && !TYPE_NEEDS_CONSTRUCTING (type) + /* We need to zero-initialize POD types. */ + if (parms == NULL_TREE + && !CLASSTYPE_NON_POD_P (type) && TYPE_HAS_DEFAULT_CONSTRUCTOR (type)) { exp = build_constructor (type, NULL); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4fed928..57ec350 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2006-10-17 Mark Mitchell <mark@codesourcery.com> + PR c++/29039 + * g++.dg/init/ctor8.C: New test. + +2006-10-17 Mark Mitchell <mark@codesourcery.com> + PR c++/27270 * g++.dg/ext/complit8.C: Tweak error markers. * g++.dg/template/complit1.C: Add error marker. diff --git a/gcc/testsuite/g++.dg/init/ctor8.C b/gcc/testsuite/g++.dg/init/ctor8.C new file mode 100644 index 0000000..9723892 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor8.C @@ -0,0 +1,11 @@ +// PR c++/29039 + +typedef struct S { // { dg-error "reference" } + int &r; +}; + +S f () { + return S (); // { dg-error "synthesized" } +} + + |