re PR c++/44516 (improve error message when no matching operator)

gcc/cp
2012-05-17  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/44516
	* typeck.c (build_x_array_ref, build_x_conditional_expr,
	build_x_compound_expr, build_x_modify_expr): Add location_t parameter.
	(finish_class_member_access_expr, build_x_indirect_ref,
	build_x_binary_op, build_x_compound_expr_from_list,
	build_x_compound_expr_from_vec): Adjust callers.
	* tree.c (build_min_nt_loc): New.
	(build_min_nt): Remove.
	* typeck2.c (build_x_arrow): Adjust callers.
	* pt.c (tsubst_qualified_id, tsubst_omp_for_iterator,
	tsubst_copy_and_build): Likewise.
	* semantics.c (finish_mem_initializers, handle_omp_for_class_iterator,
	 finish_omp_atomic): Likewise.
	* decl2.c (grok_array_decl, build_anon_union_vars): Adjust.
	* parser.c (cp_parser_question_colon_clause,
	cp_parser_assignment_expression, cp_parser_expression,
	cp_parser_template_id, cp_parser_omp_for_loop): Likewise.
	* cp-tree.h: Update.

gcc/testsuite
2012-05-17  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/44516
	* g++.dg/parse/error48.C: New.
	* g++.dg/template/crash89.C: Adjust dg-error line numbers.
	* g++.old-deja/g++.robertl/eb109.C: Add column info to dg-error string.

libstdc++
2012-05-17  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/44516
	* testsuite/20_util/ratio/cons/cons_overflow_neg.cc: Adjust
	dg-error line number.

From-SVN: r187627
This commit is contained in:
Paolo Carlini 2012-05-17 10:29:46 +00:00
parent 5264f487f0
commit f330f5991e
15 changed files with 159 additions and 78 deletions

View File

@ -1,3 +1,24 @@
2012-05-17 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/44516
* typeck.c (build_x_array_ref, build_x_conditional_expr,
build_x_compound_expr, build_x_modify_expr): Add location_t parameter.
(finish_class_member_access_expr, build_x_indirect_ref,
build_x_binary_op, build_x_compound_expr_from_list,
build_x_compound_expr_from_vec): Adjust callers.
* tree.c (build_min_nt_loc): New.
(build_min_nt): Remove.
* typeck2.c (build_x_arrow): Adjust callers.
* pt.c (tsubst_qualified_id, tsubst_omp_for_iterator,
tsubst_copy_and_build): Likewise.
* semantics.c (finish_mem_initializers, handle_omp_for_class_iterator,
finish_omp_atomic): Likewise.
* decl2.c (grok_array_decl, build_anon_union_vars): Adjust.
* parser.c (cp_parser_question_colon_clause,
cp_parser_assignment_expression, cp_parser_expression,
cp_parser_template_id, cp_parser_omp_for_loop): Likewise.
* cp-tree.h: Update.
2012-05-16 Dodji Seketeli <dodji@redhat.com> 2012-05-16 Dodji Seketeli <dodji@redhat.com>
PR preprocessor/7263 PR preprocessor/7263

View File

@ -5691,7 +5691,8 @@ extern bool lvalue_or_rvalue_with_address_p (const_tree);
extern bool xvalue_p (const_tree); extern bool xvalue_p (const_tree);
extern bool builtin_valid_in_constant_expr_p (const_tree); extern bool builtin_valid_in_constant_expr_p (const_tree);
extern tree build_min (enum tree_code, tree, ...); extern tree build_min (enum tree_code, tree, ...);
extern tree build_min_nt (enum tree_code, ...); extern tree build_min_nt_loc (location_t, enum tree_code,
...);
extern tree build_min_non_dep (enum tree_code, tree, ...); extern tree build_min_non_dep (enum tree_code, tree, ...);
extern tree build_min_non_dep_call_vec (tree, tree, VEC(tree,gc) *); extern tree build_min_non_dep_call_vec (tree, tree, VEC(tree,gc) *);
extern tree build_cplus_new (tree, tree, tsubst_flags_t); extern tree build_cplus_new (tree, tree, tsubst_flags_t);
@ -5820,7 +5821,8 @@ extern tree build_x_binary_op (location_t,
enum tree_code, tree, enum tree_code, tree,
enum tree_code, tree *, enum tree_code, tree *,
tsubst_flags_t); tsubst_flags_t);
extern tree build_x_array_ref (tree, tree, tsubst_flags_t); extern tree build_x_array_ref (location_t, tree, tree,
tsubst_flags_t);
extern tree build_x_unary_op (location_t, extern tree build_x_unary_op (location_t,
enum tree_code, tree, enum tree_code, tree,
tsubst_flags_t); tsubst_flags_t);
@ -5829,12 +5831,13 @@ extern tree cp_build_addr_expr_strict (tree, tsubst_flags_t);
extern tree cp_build_unary_op (enum tree_code, tree, int, extern tree cp_build_unary_op (enum tree_code, tree, int,
tsubst_flags_t); tsubst_flags_t);
extern tree unary_complex_lvalue (enum tree_code, tree); extern tree unary_complex_lvalue (enum tree_code, tree);
extern tree build_x_conditional_expr (tree, tree, tree, extern tree build_x_conditional_expr (location_t, tree, tree, tree,
tsubst_flags_t); tsubst_flags_t);
extern tree build_x_compound_expr_from_list (tree, expr_list_kind, extern tree build_x_compound_expr_from_list (tree, expr_list_kind,
tsubst_flags_t); tsubst_flags_t);
extern tree build_x_compound_expr_from_vec (VEC(tree,gc) *, const char *); extern tree build_x_compound_expr_from_vec (VEC(tree,gc) *, const char *);
extern tree build_x_compound_expr (tree, tree, tsubst_flags_t); extern tree build_x_compound_expr (location_t, tree, tree,
tsubst_flags_t);
extern tree build_compound_expr (location_t, tree, tree); extern tree build_compound_expr (location_t, tree, tree);
extern tree cp_build_compound_expr (tree, tree, tsubst_flags_t); extern tree cp_build_compound_expr (tree, tree, tsubst_flags_t);
extern tree build_static_cast (tree, tree, tsubst_flags_t); extern tree build_static_cast (tree, tree, tsubst_flags_t);
@ -5842,7 +5845,8 @@ extern tree build_reinterpret_cast (tree, tree, tsubst_flags_t);
extern tree build_const_cast (tree, tree, tsubst_flags_t); extern tree build_const_cast (tree, tree, tsubst_flags_t);
extern tree build_c_cast (location_t, tree, tree); extern tree build_c_cast (location_t, tree, tree);
extern tree cp_build_c_cast (tree, tree, tsubst_flags_t); extern tree cp_build_c_cast (tree, tree, tsubst_flags_t);
extern tree build_x_modify_expr (tree, enum tree_code, tree, extern tree build_x_modify_expr (location_t, tree,
enum tree_code, tree,
tsubst_flags_t); tsubst_flags_t);
extern tree cp_build_modify_expr (tree, enum tree_code, tree, extern tree cp_build_modify_expr (tree, enum tree_code, tree,
tsubst_flags_t); tsubst_flags_t);

View File

@ -350,7 +350,7 @@ grok_array_decl (location_t loc, tree array_expr, tree index_exp)
{ {
if (type_dependent_expression_p (array_expr) if (type_dependent_expression_p (array_expr)
|| type_dependent_expression_p (index_exp)) || type_dependent_expression_p (index_exp))
return build_min_nt (ARRAY_REF, array_expr, index_exp, return build_min_nt_loc (loc, ARRAY_REF, array_expr, index_exp,
NULL_TREE, NULL_TREE); NULL_TREE, NULL_TREE);
array_expr = build_non_dependent_expr (array_expr); array_expr = build_non_dependent_expr (array_expr);
index_exp = build_non_dependent_expr (index_exp); index_exp = build_non_dependent_expr (index_exp);
@ -362,9 +362,8 @@ grok_array_decl (location_t loc, tree array_expr, tree index_exp)
/* If they have an `operator[]', use that. */ /* If they have an `operator[]', use that. */
if (MAYBE_CLASS_TYPE_P (type) || MAYBE_CLASS_TYPE_P (TREE_TYPE (index_exp))) if (MAYBE_CLASS_TYPE_P (type) || MAYBE_CLASS_TYPE_P (TREE_TYPE (index_exp)))
expr = build_new_op (loc, ARRAY_REF, LOOKUP_NORMAL, expr = build_new_op (loc, ARRAY_REF, LOOKUP_NORMAL, array_expr, index_exp,
array_expr, index_exp, NULL_TREE, NULL_TREE, /*overload=*/NULL, tf_warning_or_error);
/*overload=*/NULL, tf_warning_or_error);
else else
{ {
tree p1, p2, i1, i2; tree p1, p2, i1, i2;
@ -1370,7 +1369,7 @@ build_anon_union_vars (tree type, tree object)
permerror (input_location, "protected member %q+#D in anonymous union", field); permerror (input_location, "protected member %q+#D in anonymous union", field);
if (processing_template_decl) if (processing_template_decl)
ref = build_min_nt (COMPONENT_REF, object, ref = build_min_nt_loc (UNKNOWN_LOCATION, COMPONENT_REF, object,
DECL_NAME (field), NULL_TREE); DECL_NAME (field), NULL_TREE);
else else
ref = build_class_member_access_expr (object, field, NULL_TREE, ref = build_class_member_access_expr (object, field, NULL_TREE,

View File

@ -7394,6 +7394,7 @@ cp_parser_question_colon_clause (cp_parser* parser, tree logical_or_expr)
tree expr; tree expr;
tree assignment_expr; tree assignment_expr;
struct cp_token *token; struct cp_token *token;
location_t loc = cp_lexer_peek_token (parser->lexer)->location;
/* Consume the `?' token. */ /* Consume the `?' token. */
cp_lexer_consume_token (parser->lexer); cp_lexer_consume_token (parser->lexer);
@ -7428,7 +7429,7 @@ cp_parser_question_colon_clause (cp_parser* parser, tree logical_or_expr)
c_inhibit_evaluation_warnings -= logical_or_expr == truthvalue_true_node; c_inhibit_evaluation_warnings -= logical_or_expr == truthvalue_true_node;
/* Build the conditional-expression. */ /* Build the conditional-expression. */
return build_x_conditional_expr (logical_or_expr, return build_x_conditional_expr (loc, logical_or_expr,
expr, expr,
assignment_expr, assignment_expr,
tf_warning_or_error); tf_warning_or_error);
@ -7468,11 +7469,11 @@ cp_parser_assignment_expression (cp_parser* parser, bool cast_p,
return cp_parser_question_colon_clause (parser, expr); return cp_parser_question_colon_clause (parser, expr);
else else
{ {
enum tree_code assignment_operator; location_t loc = cp_lexer_peek_token (parser->lexer)->location;
/* If it's an assignment-operator, we're using the second /* If it's an assignment-operator, we're using the second
production. */ production. */
assignment_operator enum tree_code assignment_operator
= cp_parser_assignment_operator_opt (parser); = cp_parser_assignment_operator_opt (parser);
if (assignment_operator != ERROR_MARK) if (assignment_operator != ERROR_MARK)
{ {
@ -7490,7 +7491,7 @@ cp_parser_assignment_expression (cp_parser* parser, bool cast_p,
NIC_ASSIGNMENT)) NIC_ASSIGNMENT))
return error_mark_node; return error_mark_node;
/* Build the assignment expression. */ /* Build the assignment expression. */
expr = build_x_modify_expr (expr, expr = build_x_modify_expr (loc, expr,
assignment_operator, assignment_operator,
rhs, rhs,
tf_warning_or_error); tf_warning_or_error);
@ -7599,6 +7600,7 @@ static tree
cp_parser_expression (cp_parser* parser, bool cast_p, cp_id_kind * pidk) cp_parser_expression (cp_parser* parser, bool cast_p, cp_id_kind * pidk)
{ {
tree expression = NULL_TREE; tree expression = NULL_TREE;
location_t loc = UNKNOWN_LOCATION;
while (true) while (true)
{ {
@ -7612,7 +7614,7 @@ cp_parser_expression (cp_parser* parser, bool cast_p, cp_id_kind * pidk)
if (!expression) if (!expression)
expression = assignment_expression; expression = assignment_expression;
else else
expression = build_x_compound_expr (expression, expression = build_x_compound_expr (loc, expression,
assignment_expression, assignment_expression,
tf_warning_or_error); tf_warning_or_error);
/* If the next token is not a comma, then we are done with the /* If the next token is not a comma, then we are done with the
@ -7620,6 +7622,7 @@ cp_parser_expression (cp_parser* parser, bool cast_p, cp_id_kind * pidk)
if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA)) if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
break; break;
/* Consume the `,'. */ /* Consume the `,'. */
loc = cp_lexer_peek_token (parser->lexer)->location;
cp_lexer_consume_token (parser->lexer); cp_lexer_consume_token (parser->lexer);
/* A comma operator cannot appear in a constant-expression. */ /* A comma operator cannot appear in a constant-expression. */
if (cp_parser_non_integral_constant_expression (parser, NIC_COMMA)) if (cp_parser_non_integral_constant_expression (parser, NIC_COMMA))
@ -12457,7 +12460,9 @@ cp_parser_template_id (cp_parser *parser,
/* Build a representation of the specialization. */ /* Build a representation of the specialization. */
if (TREE_CODE (templ) == IDENTIFIER_NODE) if (TREE_CODE (templ) == IDENTIFIER_NODE)
template_id = build_min_nt (TEMPLATE_ID_EXPR, templ, arguments); template_id = build_min_nt_loc (next_token->location,
TEMPLATE_ID_EXPR,
templ, arguments);
else if (DECL_TYPE_TEMPLATE_P (templ) else if (DECL_TYPE_TEMPLATE_P (templ)
|| DECL_TEMPLATE_TEMPLATE_PARM_P (templ)) || DECL_TEMPLATE_TEMPLATE_PARM_P (templ))
{ {
@ -26401,7 +26406,8 @@ cp_parser_omp_for_loop (cp_parser *parser, tree clauses, tree *par_clauses)
cp_parser_parse_definitely (parser); cp_parser_parse_definitely (parser);
cp_parser_require (parser, CPP_EQ, RT_EQ); cp_parser_require (parser, CPP_EQ, RT_EQ);
rhs = cp_parser_assignment_expression (parser, false, NULL); rhs = cp_parser_assignment_expression (parser, false, NULL);
finish_expr_stmt (build_x_modify_expr (decl, NOP_EXPR, finish_expr_stmt (build_x_modify_expr (EXPR_LOCATION (rhs),
decl, NOP_EXPR,
rhs, rhs,
tf_warning_or_error)); tf_warning_or_error));
add_private_clause = true; add_private_clause = true;

View File

@ -11932,6 +11932,7 @@ tsubst_qualified_id (tree qualified_id, tree args,
tree name; tree name;
bool is_template; bool is_template;
tree template_args; tree template_args;
location_t loc = UNKNOWN_LOCATION;
gcc_assert (TREE_CODE (qualified_id) == SCOPE_REF); gcc_assert (TREE_CODE (qualified_id) == SCOPE_REF);
@ -11940,6 +11941,7 @@ tsubst_qualified_id (tree qualified_id, tree args,
if (TREE_CODE (name) == TEMPLATE_ID_EXPR) if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
{ {
is_template = true; is_template = true;
loc = EXPR_LOCATION (name);
template_args = TREE_OPERAND (name, 1); template_args = TREE_OPERAND (name, 1);
if (template_args) if (template_args)
template_args = tsubst_template_args (template_args, args, template_args = tsubst_template_args (template_args, args,
@ -11968,7 +11970,7 @@ tsubst_qualified_id (tree qualified_id, tree args,
if (dependent_scope_p (scope)) if (dependent_scope_p (scope))
{ {
if (is_template) if (is_template)
expr = build_min_nt (TEMPLATE_ID_EXPR, expr, template_args); expr = build_min_nt_loc (loc, TEMPLATE_ID_EXPR, expr, template_args);
return build_qualified_name (NULL_TREE, scope, expr, return build_qualified_name (NULL_TREE, scope, expr,
QUALIFIED_NAME_IS_TEMPLATE (qualified_id)); QUALIFIED_NAME_IS_TEMPLATE (qualified_id));
} }
@ -12672,7 +12674,8 @@ tsubst_omp_for_iterator (tree t, int i, tree declv, tree initv,
cond = RECUR (TREE_VEC_ELT (OMP_FOR_COND (t), i)); cond = RECUR (TREE_VEC_ELT (OMP_FOR_COND (t), i));
incr = TREE_VEC_ELT (OMP_FOR_INCR (t), i); incr = TREE_VEC_ELT (OMP_FOR_INCR (t), i);
if (TREE_CODE (incr) == MODIFY_EXPR) if (TREE_CODE (incr) == MODIFY_EXPR)
incr = build_x_modify_expr (RECUR (TREE_OPERAND (incr, 0)), NOP_EXPR, incr = build_x_modify_expr (EXPR_LOCATION (incr),
RECUR (TREE_OPERAND (incr, 0)), NOP_EXPR,
RECUR (TREE_OPERAND (incr, 1)), RECUR (TREE_OPERAND (incr, 1)),
complain); complain);
else else
@ -13638,7 +13641,8 @@ tsubst_copy_and_build (tree t,
case ARRAY_REF: case ARRAY_REF:
op1 = tsubst_non_call_postfix_expression (TREE_OPERAND (t, 0), op1 = tsubst_non_call_postfix_expression (TREE_OPERAND (t, 0),
args, complain, in_decl); args, complain, in_decl);
return build_x_array_ref (op1, RECUR (TREE_OPERAND (t, 1)), complain); return build_x_array_ref (EXPR_LOCATION (t), op1,
RECUR (TREE_OPERAND (t, 1)), complain);
case SIZEOF_EXPR: case SIZEOF_EXPR:
if (PACK_EXPANSION_P (TREE_OPERAND (t, 0))) if (PACK_EXPANSION_P (TREE_OPERAND (t, 0)))
@ -13699,7 +13703,8 @@ tsubst_copy_and_build (tree t,
case MODOP_EXPR: case MODOP_EXPR:
{ {
tree r = build_x_modify_expr tree r = build_x_modify_expr
(RECUR (TREE_OPERAND (t, 0)), (EXPR_LOCATION (t),
RECUR (TREE_OPERAND (t, 0)),
TREE_CODE (TREE_OPERAND (t, 1)), TREE_CODE (TREE_OPERAND (t, 1)),
RECUR (TREE_OPERAND (t, 2)), RECUR (TREE_OPERAND (t, 2)),
complain); complain);
@ -13783,7 +13788,8 @@ tsubst_copy_and_build (tree t,
complain); complain);
case COMPOUND_EXPR: case COMPOUND_EXPR:
return build_x_compound_expr (RECUR (TREE_OPERAND (t, 0)), return build_x_compound_expr (EXPR_LOCATION (t),
RECUR (TREE_OPERAND (t, 0)),
RECUR (TREE_OPERAND (t, 1)), RECUR (TREE_OPERAND (t, 1)),
complain); complain);
@ -14023,7 +14029,8 @@ tsubst_copy_and_build (tree t,
exp2 = RECUR (TREE_OPERAND (t, 2)); exp2 = RECUR (TREE_OPERAND (t, 2));
} }
return build_x_conditional_expr (cond, exp1, exp2, complain); return build_x_conditional_expr (EXPR_LOCATION (t),
cond, exp1, exp2, complain);
} }
case PSEUDO_DTOR_EXPR: case PSEUDO_DTOR_EXPR:

View File

@ -1498,7 +1498,8 @@ finish_mem_initializers (tree mem_inits)
TREE_VALUE (mem) = error_mark_node; TREE_VALUE (mem) = error_mark_node;
} }
add_stmt (build_min_nt (CTOR_INITIALIZER, mem_inits)); add_stmt (build_min_nt_loc (UNKNOWN_LOCATION,
CTOR_INITIALIZER, mem_inits));
} }
else else
emit_mem_initializers (mem_inits); emit_mem_initializers (mem_inits);
@ -4456,7 +4457,8 @@ handle_omp_for_class_iterator (int i, location_t locus, tree declv, tree initv,
cond = error_mark_node; cond = error_mark_node;
else else
{ {
tree tem = build_x_binary_op (input_location, TREE_CODE (cond), tree tem = build_x_binary_op (EXPR_LOCATION (cond),
TREE_CODE (cond),
iter, ERROR_MARK, iter, ERROR_MARK,
TREE_OPERAND (cond, 1), ERROR_MARK, TREE_OPERAND (cond, 1), ERROR_MARK,
NULL, tf_warning_or_error); NULL, tf_warning_or_error);
@ -4473,7 +4475,7 @@ handle_omp_for_class_iterator (int i, location_t locus, tree declv, tree initv,
error_at (elocus, "invalid controlling predicate"); error_at (elocus, "invalid controlling predicate");
return true; return true;
} }
diff = build_x_binary_op (input_location, MINUS_EXPR, TREE_OPERAND (cond, 1), diff = build_x_binary_op (elocus, MINUS_EXPR, TREE_OPERAND (cond, 1),
ERROR_MARK, iter, ERROR_MARK, NULL, ERROR_MARK, iter, ERROR_MARK, NULL,
tf_warning_or_error); tf_warning_or_error);
if (error_operand_p (diff)) if (error_operand_p (diff))
@ -4496,7 +4498,8 @@ handle_omp_for_class_iterator (int i, location_t locus, tree declv, tree initv,
incr = error_mark_node; incr = error_mark_node;
break; break;
} }
iter_incr = build_x_unary_op (input_location, TREE_CODE (incr), iter, iter_incr = build_x_unary_op (EXPR_LOCATION (incr),
TREE_CODE (incr), iter,
tf_warning_or_error); tf_warning_or_error);
if (error_operand_p (iter_incr)) if (error_operand_p (iter_incr))
return true; return true;
@ -4520,7 +4523,8 @@ handle_omp_for_class_iterator (int i, location_t locus, tree declv, tree initv,
incr = error_mark_node; incr = error_mark_node;
else else
{ {
iter_incr = build_x_modify_expr (iter, TREE_CODE (rhs), iter_incr = build_x_modify_expr (EXPR_LOCATION (rhs),
iter, TREE_CODE (rhs),
TREE_OPERAND (rhs, 1), TREE_OPERAND (rhs, 1),
tf_warning_or_error); tf_warning_or_error);
if (error_operand_p (iter_incr)) if (error_operand_p (iter_incr))
@ -4546,14 +4550,16 @@ handle_omp_for_class_iterator (int i, location_t locus, tree declv, tree initv,
incr = error_mark_node; incr = error_mark_node;
else else
{ {
iter_incr = build_x_binary_op (input_location, PLUS_EXPR, iter_incr = build_x_binary_op (EXPR_LOCATION (rhs),
PLUS_EXPR,
TREE_OPERAND (rhs, 0), TREE_OPERAND (rhs, 0),
ERROR_MARK, iter, ERROR_MARK, iter,
ERROR_MARK, NULL, ERROR_MARK, NULL,
tf_warning_or_error); tf_warning_or_error);
if (error_operand_p (iter_incr)) if (error_operand_p (iter_incr))
return true; return true;
iter_incr = build_x_modify_expr (iter, NOP_EXPR, iter_incr = build_x_modify_expr (EXPR_LOCATION (rhs),
iter, NOP_EXPR,
iter_incr, iter_incr,
tf_warning_or_error); tf_warning_or_error);
if (error_operand_p (iter_incr)) if (error_operand_p (iter_incr))
@ -4604,18 +4610,22 @@ handle_omp_for_class_iterator (int i, location_t locus, tree declv, tree initv,
if (orig_pre_body) if (orig_pre_body)
add_stmt (orig_pre_body); add_stmt (orig_pre_body);
if (init != NULL) if (init != NULL)
finish_expr_stmt (build_x_modify_expr (iter, NOP_EXPR, init, finish_expr_stmt (build_x_modify_expr (elocus,
iter, NOP_EXPR, init,
tf_warning_or_error)); tf_warning_or_error));
init = build_int_cst (TREE_TYPE (diff), 0); init = build_int_cst (TREE_TYPE (diff), 0);
if (c && iter_incr == NULL) if (c && iter_incr == NULL)
{ {
finish_expr_stmt (build_x_modify_expr (incr_var, NOP_EXPR, finish_expr_stmt (build_x_modify_expr (elocus,
incr_var, NOP_EXPR,
incr, tf_warning_or_error)); incr, tf_warning_or_error));
incr = incr_var; incr = incr_var;
iter_incr = build_x_modify_expr (iter, PLUS_EXPR, incr, iter_incr = build_x_modify_expr (elocus,
iter, PLUS_EXPR, incr,
tf_warning_or_error); tf_warning_or_error);
} }
finish_expr_stmt (build_x_modify_expr (last, NOP_EXPR, init, finish_expr_stmt (build_x_modify_expr (elocus,
last, NOP_EXPR, init,
tf_warning_or_error)); tf_warning_or_error));
*pre_body = pop_stmt_list (*pre_body); *pre_body = pop_stmt_list (*pre_body);
@ -4628,11 +4638,13 @@ handle_omp_for_class_iterator (int i, location_t locus, tree declv, tree initv,
orig_body = *body; orig_body = *body;
*body = push_stmt_list (); *body = push_stmt_list ();
iter_init = build2 (MINUS_EXPR, TREE_TYPE (diff), decl, last); iter_init = build2 (MINUS_EXPR, TREE_TYPE (diff), decl, last);
iter_init = build_x_modify_expr (iter, PLUS_EXPR, iter_init, iter_init = build_x_modify_expr (elocus,
iter, PLUS_EXPR, iter_init,
tf_warning_or_error); tf_warning_or_error);
iter_init = build1 (NOP_EXPR, void_type_node, iter_init); iter_init = build1 (NOP_EXPR, void_type_node, iter_init);
finish_expr_stmt (iter_init); finish_expr_stmt (iter_init);
finish_expr_stmt (build_x_modify_expr (last, NOP_EXPR, decl, finish_expr_stmt (build_x_modify_expr (elocus,
last, NOP_EXPR, decl,
tf_warning_or_error)); tf_warning_or_error));
add_stmt (orig_body); add_stmt (orig_body);
*body = pop_stmt_list (*body); *body = pop_stmt_list (*body);
@ -4939,7 +4951,8 @@ finish_omp_atomic (enum tree_code code, enum tree_code opcode, tree lhs,
{ {
if (code == OMP_ATOMIC_READ) if (code == OMP_ATOMIC_READ)
{ {
stmt = build_min_nt (OMP_ATOMIC_READ, orig_lhs); stmt = build_min_nt_loc (EXPR_LOCATION (orig_lhs),
OMP_ATOMIC_READ, orig_lhs);
stmt = build2 (MODIFY_EXPR, void_type_node, orig_v, stmt); stmt = build2 (MODIFY_EXPR, void_type_node, orig_v, stmt);
} }
else else
@ -4949,10 +4962,12 @@ finish_omp_atomic (enum tree_code code, enum tree_code opcode, tree lhs,
else else
stmt = build2 (opcode, void_type_node, orig_lhs, orig_rhs); stmt = build2 (opcode, void_type_node, orig_lhs, orig_rhs);
if (orig_rhs1) if (orig_rhs1)
stmt = build_min_nt (COMPOUND_EXPR, orig_rhs1, stmt); stmt = build_min_nt_loc (EXPR_LOCATION (orig_rhs1),
COMPOUND_EXPR, orig_rhs1, stmt);
if (code != OMP_ATOMIC) if (code != OMP_ATOMIC)
{ {
stmt = build_min_nt (code, orig_lhs1, stmt); stmt = build_min_nt_loc (EXPR_LOCATION (orig_lhs1),
code, orig_lhs1, stmt);
stmt = build2 (MODIFY_EXPR, void_type_node, orig_v, stmt); stmt = build2 (MODIFY_EXPR, void_type_node, orig_v, stmt);
} }
} }

View File

@ -2025,7 +2025,7 @@ break_out_target_exprs (tree t)
expressions */ expressions */
tree tree
build_min_nt (enum tree_code code, ...) build_min_nt_loc (location_t loc, enum tree_code code, ...)
{ {
tree t; tree t;
int length; int length;
@ -2037,6 +2037,7 @@ build_min_nt (enum tree_code code, ...)
va_start (p, code); va_start (p, code);
t = make_node (code); t = make_node (code);
SET_EXPR_LOCATION (t, loc);
length = TREE_CODE_LENGTH (code); length = TREE_CODE_LENGTH (code);
for (i = 0; i < length; i++) for (i = 0; i < length; i++)

View File

@ -2536,7 +2536,8 @@ finish_class_member_access_expr (tree object, tree name, bool template_p,
|| (TREE_CODE (name) == SCOPE_REF || (TREE_CODE (name) == SCOPE_REF
&& TYPE_P (TREE_OPERAND (name, 0)) && TYPE_P (TREE_OPERAND (name, 0))
&& dependent_type_p (TREE_OPERAND (name, 0)))) && dependent_type_p (TREE_OPERAND (name, 0))))
return build_min_nt (COMPONENT_REF, object, name, NULL_TREE); return build_min_nt_loc (UNKNOWN_LOCATION, COMPONENT_REF,
object, name, NULL_TREE);
object = build_non_dependent_expr (object); object = build_non_dependent_expr (object);
} }
else if (c_dialect_objc () else if (c_dialect_objc ()
@ -2743,7 +2744,7 @@ build_x_indirect_ref (location_t loc, tree expr, ref_operator errorstring,
if (TREE_TYPE (expr) && POINTER_TYPE_P (TREE_TYPE (expr))) if (TREE_TYPE (expr) && POINTER_TYPE_P (TREE_TYPE (expr)))
return build_min (INDIRECT_REF, TREE_TYPE (TREE_TYPE (expr)), expr); return build_min (INDIRECT_REF, TREE_TYPE (TREE_TYPE (expr)), expr);
if (type_dependent_expression_p (expr)) if (type_dependent_expression_p (expr))
return build_min_nt (INDIRECT_REF, expr); return build_min_nt_loc (loc, INDIRECT_REF, expr);
expr = build_non_dependent_expr (expr); expr = build_non_dependent_expr (expr);
} }
@ -3597,7 +3598,7 @@ build_x_binary_op (location_t loc, enum tree_code code, tree arg1,
{ {
if (type_dependent_expression_p (arg1) if (type_dependent_expression_p (arg1)
|| type_dependent_expression_p (arg2)) || type_dependent_expression_p (arg2))
return build_min_nt (code, arg1, arg2); return build_min_nt_loc (loc, code, arg1, arg2);
arg1 = build_non_dependent_expr (arg1); arg1 = build_non_dependent_expr (arg1);
arg2 = build_non_dependent_expr (arg2); arg2 = build_non_dependent_expr (arg2);
} }
@ -3629,7 +3630,8 @@ build_x_binary_op (location_t loc, enum tree_code code, tree arg1,
/* Build and return an ARRAY_REF expression. */ /* Build and return an ARRAY_REF expression. */
tree tree
build_x_array_ref (tree arg1, tree arg2, tsubst_flags_t complain) build_x_array_ref (location_t loc, tree arg1, tree arg2,
tsubst_flags_t complain)
{ {
tree orig_arg1 = arg1; tree orig_arg1 = arg1;
tree orig_arg2 = arg2; tree orig_arg2 = arg2;
@ -3639,14 +3641,14 @@ build_x_array_ref (tree arg1, tree arg2, tsubst_flags_t complain)
{ {
if (type_dependent_expression_p (arg1) if (type_dependent_expression_p (arg1)
|| type_dependent_expression_p (arg2)) || type_dependent_expression_p (arg2))
return build_min_nt (ARRAY_REF, arg1, arg2, return build_min_nt_loc (loc, ARRAY_REF, arg1, arg2,
NULL_TREE, NULL_TREE); NULL_TREE, NULL_TREE);
arg1 = build_non_dependent_expr (arg1); arg1 = build_non_dependent_expr (arg1);
arg2 = build_non_dependent_expr (arg2); arg2 = build_non_dependent_expr (arg2);
} }
expr = build_new_op (input_location, ARRAY_REF, LOOKUP_NORMAL, arg1, expr = build_new_op (loc, ARRAY_REF, LOOKUP_NORMAL, arg1, arg2,
arg2, NULL_TREE, /*overload=*/NULL, complain); NULL_TREE, /*overload=*/NULL, complain);
if (processing_template_decl && expr != error_mark_node) if (processing_template_decl && expr != error_mark_node)
return build_min_non_dep (ARRAY_REF, expr, orig_arg1, orig_arg2, return build_min_non_dep (ARRAY_REF, expr, orig_arg1, orig_arg2,
@ -4671,7 +4673,7 @@ build_x_unary_op (location_t loc, enum tree_code code, tree xarg,
if (processing_template_decl) if (processing_template_decl)
{ {
if (type_dependent_expression_p (xarg)) if (type_dependent_expression_p (xarg))
return build_min_nt (code, xarg, NULL_TREE); return build_min_nt_loc (loc, code, xarg, NULL_TREE);
xarg = build_non_dependent_expr (xarg); xarg = build_non_dependent_expr (xarg);
} }
@ -5586,7 +5588,7 @@ cxx_mark_addressable (tree exp)
/* Build and return a conditional expression IFEXP ? OP1 : OP2. */ /* Build and return a conditional expression IFEXP ? OP1 : OP2. */
tree tree
build_x_conditional_expr (tree ifexp, tree op1, tree op2, build_x_conditional_expr (location_t loc, tree ifexp, tree op1, tree op2,
tsubst_flags_t complain) tsubst_flags_t complain)
{ {
tree orig_ifexp = ifexp; tree orig_ifexp = ifexp;
@ -5603,7 +5605,7 @@ build_x_conditional_expr (tree ifexp, tree op1, tree op2,
/* As a GNU extension, the middle operand may be omitted. */ /* As a GNU extension, the middle operand may be omitted. */
|| (op1 && type_dependent_expression_p (op1)) || (op1 && type_dependent_expression_p (op1))
|| type_dependent_expression_p (op2)) || type_dependent_expression_p (op2))
return build_min_nt (COND_EXPR, ifexp, op1, op2); return build_min_nt_loc (loc, COND_EXPR, ifexp, op1, op2);
ifexp = build_non_dependent_expr (ifexp); ifexp = build_non_dependent_expr (ifexp);
if (op1) if (op1)
op1 = build_non_dependent_expr (op1); op1 = build_non_dependent_expr (op1);
@ -5670,8 +5672,8 @@ build_x_compound_expr_from_list (tree list, expr_list_kind exp,
return error_mark_node; return error_mark_node;
for (list = TREE_CHAIN (list); list; list = TREE_CHAIN (list)) for (list = TREE_CHAIN (list); list; list = TREE_CHAIN (list))
expr = build_x_compound_expr (expr, TREE_VALUE (list), expr = build_x_compound_expr (EXPR_LOCATION (TREE_VALUE (list)),
complain); expr, TREE_VALUE (list), complain);
} }
return expr; return expr;
@ -5699,7 +5701,8 @@ build_x_compound_expr_from_vec (VEC(tree,gc) *vec, const char *msg)
expr = VEC_index (tree, vec, 0); expr = VEC_index (tree, vec, 0);
for (ix = 1; VEC_iterate (tree, vec, ix, t); ++ix) for (ix = 1; VEC_iterate (tree, vec, ix, t); ++ix)
expr = build_x_compound_expr (expr, t, tf_warning_or_error); expr = build_x_compound_expr (EXPR_LOCATION (t), expr,
t, tf_warning_or_error);
return expr; return expr;
} }
@ -5708,7 +5711,8 @@ build_x_compound_expr_from_vec (VEC(tree,gc) *vec, const char *msg)
/* Handle overloading of the ',' operator when needed. */ /* Handle overloading of the ',' operator when needed. */
tree tree
build_x_compound_expr (tree op1, tree op2, tsubst_flags_t complain) build_x_compound_expr (location_t loc, tree op1, tree op2,
tsubst_flags_t complain)
{ {
tree result; tree result;
tree orig_op1 = op1; tree orig_op1 = op1;
@ -5718,13 +5722,13 @@ build_x_compound_expr (tree op1, tree op2, tsubst_flags_t complain)
{ {
if (type_dependent_expression_p (op1) if (type_dependent_expression_p (op1)
|| type_dependent_expression_p (op2)) || type_dependent_expression_p (op2))
return build_min_nt (COMPOUND_EXPR, op1, op2); return build_min_nt_loc (loc, COMPOUND_EXPR, op1, op2);
op1 = build_non_dependent_expr (op1); op1 = build_non_dependent_expr (op1);
op2 = build_non_dependent_expr (op2); op2 = build_non_dependent_expr (op2);
} }
result = build_new_op (input_location, COMPOUND_EXPR, LOOKUP_NORMAL, result = build_new_op (loc, COMPOUND_EXPR, LOOKUP_NORMAL, op1, op2,
op1, op2, NULL_TREE, /*overload=*/NULL, complain); NULL_TREE, /*overload=*/NULL, complain);
if (!result) if (!result)
result = cp_build_compound_expr (op1, op2, complain); result = cp_build_compound_expr (op1, op2, complain);
@ -7105,18 +7109,19 @@ cp_build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs,
} }
tree tree
build_x_modify_expr (tree lhs, enum tree_code modifycode, tree rhs, build_x_modify_expr (location_t loc, tree lhs, enum tree_code modifycode,
tsubst_flags_t complain) tree rhs, tsubst_flags_t complain)
{ {
if (processing_template_decl) if (processing_template_decl)
return build_min_nt (MODOP_EXPR, lhs, return build_min_nt_loc (loc, MODOP_EXPR, lhs,
build_min_nt (modifycode, NULL_TREE, NULL_TREE), rhs); build_min_nt_loc (loc, modifycode, NULL_TREE,
NULL_TREE), rhs);
if (modifycode != NOP_EXPR) if (modifycode != NOP_EXPR)
{ {
tree rval = build_new_op (input_location, MODIFY_EXPR, LOOKUP_NORMAL, tree rval = build_new_op (loc, MODIFY_EXPR, LOOKUP_NORMAL, lhs, rhs,
lhs, rhs, make_node (modifycode), make_node (modifycode), /*overload=*/NULL,
/*overload=*/NULL, complain); complain);
if (rval) if (rval)
{ {
TREE_NO_WARNING (rval) = 1; TREE_NO_WARNING (rval) = 1;

View File

@ -1484,7 +1484,7 @@ build_x_arrow (location_t loc, tree expr, tsubst_flags_t complain)
if (processing_template_decl) if (processing_template_decl)
{ {
if (type_dependent_expression_p (expr)) if (type_dependent_expression_p (expr))
return build_min_nt (ARROW_EXPR, expr); return build_min_nt_loc (loc, ARROW_EXPR, expr);
expr = build_non_dependent_expr (expr); expr = build_non_dependent_expr (expr);
} }

View File

@ -1,3 +1,10 @@
2012-05-17 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/44516
* g++.dg/parse/error48.C: New.
* g++.dg/template/crash89.C: Adjust dg-error line numbers.
* g++.old-deja/g++.robertl/eb109.C: Add column info to dg-error string.
2012-05-16 Patrick Marlier <patrick.marlier@gmail.com> 2012-05-16 Patrick Marlier <patrick.marlier@gmail.com>
* gcc.dg/tm/indirect-2.c: New test. * gcc.dg/tm/indirect-2.c: New test.

View File

@ -0,0 +1,10 @@
// PR c++/44516
struct WebService { };
struct Server { };
void addHTTPService(Server const &server,
WebService const *http)
{
server += http; // { dg-error "10:no match for 'operator\\+='" }
}

View File

@ -1,8 +1,8 @@
// PR c++/34397 // PR c++/34397
template<typename T, int = T()[0]> struct A template<typename T, int = T()[0]> struct A // { dg-error "subscripted|template" }
{ {
typedef A<T> B; typedef A<T> B;
}; };
A<int> a; // { dg-error "subscripted|template|declaration" } A<int> a; // { dg-error "declaration" }

View File

@ -44,16 +44,16 @@ ostream& operator<<(ostream& os, Graph<VertexType,EdgeType>& G)
// display of vertices with successors // display of vertices with successors
for(int i = 0; i < G.size(); ++i) // { dg-error "no member" } no size function for(int i = 0; i < G.size(); ++i) // { dg-error "no member" } no size function
{ {
os << G[i].first << " <"; // { dg-error "no match" } no index operator os << G[i].first << " <"; // { dg-error "14:no match" } no index operator
// The compiler does not like this line!!!!!! // The compiler does not like this line!!!!!!
typename Graph<VertexType, EdgeType>::Successor::iterator typename Graph<VertexType, EdgeType>::Successor::iterator
startN = G[i].second.begin(), // { dg-error "no match" } no index operator startN = G[i].second.begin(), // { dg-error "14:no match" } no index operator
endN = G[i].second.end(); // { dg-error "no match" } no index operator endN = G[i].second.end(); // { dg-error "14:no match" } no index operator
while(startN != endN) while(startN != endN)
{ {
os << G[(*startN).first].first << ' ' // { dg-error "no match" } no index operator os << G[(*startN).first].first << ' ' // { dg-error "20:no match" } no index operator
<< (*startN).second << ' '; << (*startN).second << ' ';
++startN; ++startN;
} }

View File

@ -1,3 +1,9 @@
2012-05-17 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/44516
* testsuite/20_util/ratio/cons/cons_overflow_neg.cc: Adjust
dg-error line number.
2012-05-16 H.J. Lu <hongjiu.lu@intel.com> 2012-05-16 H.J. Lu <hongjiu.lu@intel.com>
* configure: Regenerated. * configure: Regenerated.

View File

@ -2,7 +2,7 @@
// { dg-options "-std=gnu++0x" } // { dg-options "-std=gnu++0x" }
// { dg-require-cstdint "" } // { dg-require-cstdint "" }
// Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation // Copyright (C) 2008, 2009, 2010, 2011, 2012 Free Software Foundation
// //
// This file is part of the GNU ISO C++ Library. This library is free // This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the // software; you can redistribute it and/or modify it under the
@ -51,5 +51,5 @@ test04()
// { dg-error "required from here" "" { target *-*-* } 46 } // { dg-error "required from here" "" { target *-*-* } 46 }
// { dg-error "denominator cannot be zero" "" { target *-*-* } 265 } // { dg-error "denominator cannot be zero" "" { target *-*-* } 265 }
// { dg-error "out of range" "" { target *-*-* } 266 } // { dg-error "out of range" "" { target *-*-* } 266 }
// { dg-error "overflow in constant expression" "" { target *-*-* } 61 } // { dg-error "overflow in constant expression" "" { target *-*-* } 62 }
// { dg-prune-output "not a member" } // { dg-prune-output "not a member" }