aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/parser.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2003-03-16 14:36:43 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2003-03-16 14:36:43 +0000
commit1f5a253a36c2e680af7a627a5077a61fb8afe6b6 (patch)
tree7874404e7e5a23052c2153596208ca845cfa33ef /gcc/cp/parser.c
parent46ea50cb66f3edc9f5f474067e61bfe39c41cb06 (diff)
downloadgcc-1f5a253a36c2e680af7a627a5077a61fb8afe6b6.zip
gcc-1f5a253a36c2e680af7a627a5077a61fb8afe6b6.tar.gz
gcc-1f5a253a36c2e680af7a627a5077a61fb8afe6b6.tar.bz2
re PR c++/9629 (virtual inheritance segfault)
cp: PR c++/9629 * cp-tree.h (struct language_function): Add in_base_initializer. (in_base_initializer): define it. (expand_member_init): Remove INIT param. * init.c (expand_member_init): Remove INIT param, return the member. (emit_mem_initializers): Set in_base_initializer. * class.c (build_base_path): Check in_base_initializer. * parser.c (cp_parser_mem_initializer): Set in_base_initializer. * pt.c (tsubst_initializer_list): Likewise. testsuite: PR c++/9629 * g++.dg/init/ctor2.C: New test. From-SVN: r64438
Diffstat (limited to 'gcc/cp/parser.c')
-rw-r--r--gcc/cp/parser.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 1c83227..f80c260 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -7236,7 +7236,8 @@ cp_parser_mem_initializer (cp_parser* parser)
{
tree mem_initializer_id;
tree expression_list;
-
+ tree member;
+
/* Find out what is being initialized. */
if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
{
@@ -7245,6 +7246,10 @@ cp_parser_mem_initializer (cp_parser* parser)
}
else
mem_initializer_id = cp_parser_mem_initializer_id (parser);
+ member = expand_member_init (mem_initializer_id);
+ if (member && !DECL_P (member))
+ in_base_initializer = 1;
+
/* Look for the opening `('. */
cp_parser_require (parser, CPP_OPEN_PAREN, "`('");
/* Parse the expression-list. */
@@ -7256,8 +7261,9 @@ cp_parser_mem_initializer (cp_parser* parser)
/* Look for the closing `)'. */
cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
- return expand_member_init (mem_initializer_id,
- expression_list);
+ in_base_initializer = 0;
+
+ return member ? build_tree_list (member, expression_list) : NULL_TREE;
}
/* Parse a mem-initializer-id.