diff options
author | Mark Mitchell <mark@codesourcery.com> | 2002-10-02 20:01:38 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2002-10-02 20:01:38 +0000 |
commit | 2282d28d488248a113c9f172f8f0f0bca73419c7 (patch) | |
tree | 245a8ba4ee36bea837735b3570838103f4f7e63f /gcc/cp/method.c | |
parent | 854ef3909dcc16b363d5300d096823fa4c6afdc5 (diff) | |
download | gcc-2282d28d488248a113c9f172f8f0f0bca73419c7.zip gcc-2282d28d488248a113c9f172f8f0f0bca73419c7.tar.gz gcc-2282d28d488248a113c9f172f8f0f0bca73419c7.tar.bz2 |
re PR c++/7188 (Segfault with template class and recursive (incorrect) initalizer list.)
PR c++/7188.
* cp-tree.def (CTOR_INITIALIZER): Use one slot, not two.
* cp-tree.h (emit_base_init): Rename to ....
(emit_mem_initializers): ... this.
(expand_member_init): Change prototype.
* init.c (perform_member_init): Compute explicit, rather than
requiring it as a parameter.
(sort_member_init): Rename to ...
(sort_mem_initializers): ... this. Process bases and data members
together.
(sort_base_init): Remove.
(emit_base_init): Rename to ...
(emit_mem_initializers): ... this.
(expand_aggr_vbase_init_1): Remove.
(construct_virtual_bases): Rename to ...
(construct_virtual_base): ... this.
(expand_member_init): Rework handling of base initializers.
* method.c (do_build_copy_constructor): Use
finish_mem_initializers.
* parse.y (member_init): Adjust calls to expand_member_init.
* pt.c (tsubst_expr): Simplify CTOR_INITIALIZER case.
(tsubst_initializer_list): Use expand_member_init.
* semantics.c (finish_mem_intiailizers): Simplify.
PR c++/7188.
* g++.dg/template/meminit1.C: New test.
* g++.dg/warn/Wreorder-1.C: Likewise.
* g++.old-deja/g++.mike/warn3.C: Tweak.
* lib/prune.exp: Ingore "in copy constructor".
From-SVN: r57748
Diffstat (limited to 'gcc/cp/method.c')
-rw-r--r-- | gcc/cp/method.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/gcc/cp/method.c b/gcc/cp/method.c index 6b4b795..0658181 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -536,7 +536,6 @@ do_build_copy_constructor (fndecl) int n_bases = CLASSTYPE_N_BASECLASSES (current_class_type); tree binfos = TYPE_BINFO_BASETYPES (current_class_type); tree member_init_list = NULL_TREE; - tree base_init_list = NULL_TREE; int cvquals = cp_type_quals (TREE_TYPE (parm)); int i; @@ -550,10 +549,12 @@ do_build_copy_constructor (fndecl) { tree binfo = TREE_VALUE (t); - base_init_list = tree_cons (binfo, - build_base_path (PLUS_EXPR, parm, - binfo, 1), - base_init_list); + member_init_list + = tree_cons (binfo, + build_tree_list (NULL_TREE, + build_base_path (PLUS_EXPR, parm, + binfo, 1)), + member_init_list); } for (i = 0; i < n_bases; ++i) @@ -562,10 +563,12 @@ do_build_copy_constructor (fndecl) if (TREE_VIA_VIRTUAL (binfo)) continue; - base_init_list = tree_cons (binfo, - build_base_path (PLUS_EXPR, parm, - binfo, 1), - base_init_list); + member_init_list + = tree_cons (binfo, + build_tree_list (NULL_TREE, + build_base_path (PLUS_EXPR, parm, + binfo, 1)), + member_init_list); } for (; fields; fields = TREE_CHAIN (fields)) @@ -609,9 +612,7 @@ do_build_copy_constructor (fndecl) member_init_list = tree_cons (field, init, member_init_list); } - member_init_list = nreverse (member_init_list); - base_init_list = nreverse (base_init_list); - emit_base_init (member_init_list, base_init_list); + finish_mem_initializers (member_init_list); } } |