diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2003-03-16 14:36:43 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2003-03-16 14:36:43 +0000 |
commit | 1f5a253a36c2e680af7a627a5077a61fb8afe6b6 (patch) | |
tree | 7874404e7e5a23052c2153596208ca845cfa33ef /gcc/cp/parser.c | |
parent | 46ea50cb66f3edc9f5f474067e61bfe39c41cb06 (diff) | |
download | gcc-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.c | 12 |
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. |