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
This commit is contained in:
Mark Mitchell 2006-10-17 22:35:29 +00:00 committed by Mark Mitchell
parent 05b22df961
commit c7b0e0273e
5 changed files with 28 additions and 4 deletions

View File

@ -1,3 +1,11 @@
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> 2006-10-17 Mark Mitchell <mark@codesourcery.com>
PR c++/27270 PR c++/27270

View File

@ -784,7 +784,7 @@ synthesize_method (tree fndecl)
tree arg_chain = FUNCTION_FIRST_USER_PARMTYPE (fndecl); tree arg_chain = FUNCTION_FIRST_USER_PARMTYPE (fndecl);
if (arg_chain != void_list_node) if (arg_chain != void_list_node)
do_build_copy_constructor (fndecl); do_build_copy_constructor (fndecl);
else if (TYPE_NEEDS_CONSTRUCTING (current_class_type)) else
finish_mem_initializers (NULL_TREE); finish_mem_initializers (NULL_TREE);
} }

View File

@ -1333,9 +1333,9 @@ build_functional_cast (tree exp, tree parms)
if (parms && TREE_CHAIN (parms) == NULL_TREE) if (parms && TREE_CHAIN (parms) == NULL_TREE)
return build_c_cast (type, TREE_VALUE (parms)); return build_c_cast (type, TREE_VALUE (parms));
/* We need to zero-initialize POD types. Let's do that for everything /* We need to zero-initialize POD types. */
that doesn't need a constructor. */ if (parms == NULL_TREE
if (parms == NULL_TREE && !TYPE_NEEDS_CONSTRUCTING (type) && !CLASSTYPE_NON_POD_P (type)
&& TYPE_HAS_DEFAULT_CONSTRUCTOR (type)) && TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
{ {
exp = build_constructor (type, NULL); exp = build_constructor (type, NULL);

View File

@ -1,3 +1,8 @@
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> 2006-10-17 Mark Mitchell <mark@codesourcery.com>
PR c++/27270 PR c++/27270

View File

@ -0,0 +1,11 @@
// PR c++/29039
typedef struct S { // { dg-error "reference" }
int &r;
};
S f () {
return S (); // { dg-error "synthesized" }
}