From 2dc6ed8700c2928d30be6d5d035095b4977e7dad Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Thu, 12 Sep 2013 13:49:18 +0000 Subject: [PATCH] semantics.c (finish_pseudo_destructor_expr): Add location_t parameter. 2013-09-12 Paolo Carlini * semantics.c (finish_pseudo_destructor_expr): Add location_t parameter. * pt.c (unify_arg_conversion): Use EXPR_LOC_OR_HERE. (tsubst_copy_and_build): Adjust finish_pseudo_destructor_expr calls. * parser.c (cp_parser_postfix_dot_deref_expression): Likewise. (cp_parser_postfix_expression): Pass the proper location to cp_parser_postfix_dot_deref_expression. /testsuite 2013-09-12 Paolo Carlini * g++.dg/template/pseudodtor2.C: Add column number to dg-error strings. * g++.dg/template/pseudodtor3.C: Likewise. From-SVN: r202528 --- gcc/cp/ChangeLog | 11 +++++++++++ gcc/cp/parser.c | 8 ++++---- gcc/cp/pt.c | 13 ++++++++----- gcc/cp/semantics.c | 15 +++++++++------ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/template/pseudodtor2.C | 2 +- gcc/testsuite/g++.dg/template/pseudodtor3.C | 10 +++++----- 7 files changed, 44 insertions(+), 21 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6d32109fff5..a0935dc404f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,14 @@ +2013-09-12 Paolo Carlini + + * semantics.c (finish_pseudo_destructor_expr): Add location_t + parameter. + * pt.c (unify_arg_conversion): Use EXPR_LOC_OR_HERE. + (tsubst_copy_and_build): Adjust finish_pseudo_destructor_expr + calls. + * parser.c (cp_parser_postfix_dot_deref_expression): Likewise. + (cp_parser_postfix_expression): Pass the proper location to + cp_parser_postfix_dot_deref_expression. + 2013-09-10 Jan Hubicka Paolo Carlini diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 923277b6daa..e00e56c6e01 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -5533,6 +5533,7 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, cp_id_kind * pidk_return) { cp_token *token; + location_t loc; enum rid keyword; cp_id_kind idk = CP_ID_KIND_NONE; tree postfix_expression = NULL_TREE; @@ -5540,6 +5541,7 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, /* Peek at the next token. */ token = cp_lexer_peek_token (parser->lexer); + loc = token->location; /* Some of the productions are determined by keywords. */ keyword = token->keyword; switch (keyword) @@ -5685,7 +5687,6 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, vec *vec; unsigned int i; tree p; - location_t loc = token->location; cp_lexer_consume_token (parser->lexer); vec = cp_parser_parenthesized_expression_list (parser, non_attr, @@ -6018,8 +6019,7 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, postfix_expression = cp_parser_postfix_dot_deref_expression (parser, token->type, postfix_expression, - false, &idk, - token->location); + false, &idk, loc); is_member_access = true; break; @@ -6338,7 +6338,7 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser, pseudo_destructor_p = true; postfix_expression = finish_pseudo_destructor_expr (postfix_expression, - s, type); + s, type, location); } } diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e937318d227..e4ae4b76305 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5398,7 +5398,8 @@ unify_arg_conversion (bool explain_p, tree to_type, tree from_type, tree arg) { if (explain_p) - inform (input_location, " cannot convert %qE (type %qT) to type %qT", + inform (EXPR_LOC_OR_HERE (arg), + " cannot convert %qE (type %qT) to type %qT", arg, from_type, to_type); return 1; } @@ -14292,9 +14293,10 @@ tsubst_copy_and_build (tree t, case PSEUDO_DTOR_EXPR: RETURN (finish_pseudo_destructor_expr - (RECUR (TREE_OPERAND (t, 0)), - RECUR (TREE_OPERAND (t, 1)), - tsubst (TREE_OPERAND (t, 2), args, complain, in_decl))); + (RECUR (TREE_OPERAND (t, 0)), + RECUR (TREE_OPERAND (t, 1)), + tsubst (TREE_OPERAND (t, 2), args, complain, in_decl), + input_location)); case TREE_LIST: { @@ -14423,7 +14425,8 @@ tsubst_copy_and_build (tree t, { dtor = TREE_OPERAND (dtor, 0); if (TYPE_P (dtor)) - RETURN (finish_pseudo_destructor_expr (object, s, dtor)); + RETURN (finish_pseudo_destructor_expr + (object, s, dtor, input_location)); } } } diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index ee3503cdd77..6d7f55f7319 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2361,7 +2361,8 @@ finish_this_expr (void) was of the form `OBJECT.SCOPE::~DESTRUCTOR'. */ tree -finish_pseudo_destructor_expr (tree object, tree scope, tree destructor) +finish_pseudo_destructor_expr (tree object, tree scope, tree destructor, + location_t loc) { if (object == error_mark_node || destructor == error_mark_node) return error_mark_node; @@ -2372,15 +2373,16 @@ finish_pseudo_destructor_expr (tree object, tree scope, tree destructor) { if (scope == error_mark_node) { - error ("invalid qualifying scope in pseudo-destructor name"); + error_at (loc, "invalid qualifying scope in pseudo-destructor name"); return error_mark_node; } if (is_auto (destructor)) destructor = TREE_TYPE (object); if (scope && TYPE_P (scope) && !check_dtor_name (scope, destructor)) { - error ("qualified type %qT does not match destructor name ~%qT", - scope, destructor); + error_at (loc, + "qualified type %qT does not match destructor name ~%qT", + scope, destructor); return error_mark_node; } @@ -2401,12 +2403,13 @@ finish_pseudo_destructor_expr (tree object, tree scope, tree destructor) if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (object), destructor)) { - error ("%qE is not of type %qT", object, destructor); + error_at (loc, "%qE is not of type %qT", object, destructor); return error_mark_node; } } - return build3 (PSEUDO_DTOR_EXPR, void_type_node, object, scope, destructor); + return build3_loc (loc, PSEUDO_DTOR_EXPR, void_type_node, object, + scope, destructor); } /* Finish an expression of the form CODE EXPR. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 75110d9021d..579c6b88515 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-09-12 Paolo Carlini + + * g++.dg/template/pseudodtor2.C: Add column number to dg-error + strings. + * g++.dg/template/pseudodtor3.C: Likewise. + 2013-09-12 Richard Biener PR tree-optimization/58404 diff --git a/gcc/testsuite/g++.dg/template/pseudodtor2.C b/gcc/testsuite/g++.dg/template/pseudodtor2.C index 796aff0785b..d4a9ac1cbc8 100644 --- a/gcc/testsuite/g++.dg/template/pseudodtor2.C +++ b/gcc/testsuite/g++.dg/template/pseudodtor2.C @@ -6,7 +6,7 @@ template struct D typedef int T; S foo (); - D () { foo ().~T(); } // { dg-error "is not of type" } + D () { foo ().~T(); } // { dg-error "10:is not of type" } }; struct Z diff --git a/gcc/testsuite/g++.dg/template/pseudodtor3.C b/gcc/testsuite/g++.dg/template/pseudodtor3.C index 5f392f4e492..202182f5337 100644 --- a/gcc/testsuite/g++.dg/template/pseudodtor3.C +++ b/gcc/testsuite/g++.dg/template/pseudodtor3.C @@ -5,13 +5,13 @@ struct A { typedef int T; T &foo (); - A () { foo.~T (); } // { dg-error "does not have class type|expected" } + A () { foo.~T (); } // { dg-error "10:does not have class type|expected" } }; template struct B { T &foo (); - B () { foo.~T (); } // { dg-error "invalid use of member" } + B () { foo.~T (); } // { dg-error "10:invalid use of member" } }; B b; @@ -19,7 +19,7 @@ B b; template struct C { T t; - C () { t.~S (); } // { dg-error "is not of type" } + C () { t.~S (); } // { dg-error "10:is not of type" } }; C c; @@ -28,7 +28,7 @@ template struct D { T t; typedef long int U; - D () { t.~U (); } // { dg-error "is not of type" } + D () { t.~U (); } // { dg-error "10:is not of type" } }; D d; @@ -37,7 +37,7 @@ template struct E { T &foo (); typedef long int U; - E () { foo.~U (); } // { dg-error "is not of type" } + E () { foo.~U (); } // { dg-error "10:is not of type" } }; E e;