aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2006-10-17 22:35:29 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2006-10-17 22:35:29 +0000
commitc7b0e0273ea01ccc3a8b8065944f89b6d619e787 (patch)
tree69dd14ebdbf552a0333a15bf8a7c239e37f2ec70
parent05b22df961070e926ac6bf4a8a114c5d5b1745bc (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/cp/method.c2
-rw-r--r--gcc/cp/typeck2.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/init/ctor8.C11
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" }
+}
+
+