From c8aa5037d248d3e21ca5d36746a86b005c308495 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Mon, 22 Oct 2018 13:43:00 -0400 Subject: [PATCH 12/35] FIXME: WIP on fixing g++.dg/init/pr43064-4.C --- gcc/cp/parser.c | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 9ada8a9..4c601f9 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -2298,7 +2298,7 @@ static void cp_parser_ctor_initializer_opt (cp_parser *); static void cp_parser_mem_initializer_list (cp_parser *); -static tree cp_parser_mem_initializer +static cp_expr cp_parser_mem_initializer (cp_parser *); static tree cp_parser_mem_initializer_id (cp_parser *); @@ -14513,14 +14513,21 @@ cp_parser_mem_initializer_list (cp_parser* parser) error_at (token->location, "only constructors take member initializers"); + auto_vec mem_initializer_locs; + /* Loop through the list. */ while (true) { - tree mem_initializer; + cp_expr mem_initializer; token = cp_lexer_peek_token (parser->lexer); /* Parse the mem-initializer. */ mem_initializer = cp_parser_mem_initializer (parser); + mem_initializer_locs.safe_push (mem_initializer.get_location ()); + + // FIXME: + //inform (mem_initializer.get_location (), "mem-initializer"); + /* If the next token is a `...', we're expanding member initializers. */ bool ellipsis = cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS); if (ellipsis @@ -14583,7 +14590,7 @@ cp_parser_mem_initializer_list (cp_parser* parser) /* Perform semantic analysis. */ if (DECL_CONSTRUCTOR_P (current_function_decl)) - finish_mem_initializers (mem_initializer_list); + finish_mem_initializers (mem_initializer_list/*, &mem_initializer_locs*/); } /* Parse a mem-initializer. @@ -14602,13 +14609,15 @@ cp_parser_mem_initializer_list (cp_parser* parser) the TREE_VALUE is the expression-list. An empty initialization list is represented by void_list_node. */ -static tree +static cp_expr cp_parser_mem_initializer (cp_parser* parser) { tree mem_initializer_id; tree expression_list; tree member; cp_token *token = cp_lexer_peek_token (parser->lexer); + location_t start_loc = token->location; + location_t caret_loc = UNKNOWN_LOCATION; /* Find out what is being initialized. */ if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)) @@ -14616,6 +14625,7 @@ cp_parser_mem_initializer (cp_parser* parser) permerror (token->location, "anachronistic old-style base class initializer"); mem_initializer_id = NULL_TREE; + caret_loc = start_loc; } else { @@ -14627,6 +14637,10 @@ cp_parser_mem_initializer (cp_parser* parser) if (member && !DECL_P (member)) in_base_initializer = 1; + token = cp_lexer_peek_token (parser->lexer); + if (token) + caret_loc = token->location; + if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE)) { bool expr_non_constant_p; @@ -14658,7 +14672,18 @@ cp_parser_mem_initializer (cp_parser* parser) in_base_initializer = 0; - return member ? build_tree_list (member, expression_list) : error_mark_node; + if (!member) + return error_mark_node; + + /* Generate a location of the form: + m_fieldname (arg0, arg1), + ~~~~~~~~~~~~^~~~~~~~~~~~ + */ + location_t finish_loc + = get_finish (cp_lexer_previous_token (parser->lexer)->location); + location_t combined_loc = make_location (caret_loc, start_loc, finish_loc); + + return cp_expr (build_tree_list (member, expression_list), combined_loc); } /* Parse a mem-initializer-id. -- 1.8.5.3