diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2013-09-12 13:49:18 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2013-09-12 13:49:18 +0000 |
commit | 2dc6ed8700c2928d30be6d5d035095b4977e7dad (patch) | |
tree | aed3e28195574fbdb243323a9226ea49737a80da /gcc | |
parent | b12ebd96ba91490e361a139dca9d0fc17a67312f (diff) | |
download | gcc-2dc6ed8700c2928d30be6d5d035095b4977e7dad.zip gcc-2dc6ed8700c2928d30be6d5d035095b4977e7dad.tar.gz gcc-2dc6ed8700c2928d30be6d5d035095b4977e7dad.tar.bz2 |
semantics.c (finish_pseudo_destructor_expr): Add location_t parameter.
2013-09-12 Paolo Carlini <paolo.carlini@oracle.com>
* 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 <paolo.carlini@oracle.com>
* g++.dg/template/pseudodtor2.C: Add column number to dg-error
strings.
* g++.dg/template/pseudodtor3.C: Likewise.
From-SVN: r202528
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/cp/parser.c | 8 | ||||
-rw-r--r-- | gcc/cp/pt.c | 13 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/pseudodtor2.C | 2 | ||||
-rw-r--r-- | 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 6d32109..a0935dc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,14 @@ +2013-09-12 Paolo Carlini <paolo.carlini@oracle.com> + + * 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 <jh@suse.cz> Paolo Carlini <paolo.carlini@oracle.com> diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 923277b..e00e56c 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<tree, va_gc> *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 e937318..e4ae4b7 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 ee3503c..6d7f55f 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 75110d9..579c6b8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-09-12 Paolo Carlini <paolo.carlini@oracle.com> + + * g++.dg/template/pseudodtor2.C: Add column number to dg-error + strings. + * g++.dg/template/pseudodtor3.C: Likewise. + 2013-09-12 Richard Biener <rguenther@suse.de> PR tree-optimization/58404 diff --git a/gcc/testsuite/g++.dg/template/pseudodtor2.C b/gcc/testsuite/g++.dg/template/pseudodtor2.C index 796aff0..d4a9ac1 100644 --- a/gcc/testsuite/g++.dg/template/pseudodtor2.C +++ b/gcc/testsuite/g++.dg/template/pseudodtor2.C @@ -6,7 +6,7 @@ template<typename S> 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 5f392f4..202182f 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 <typename T> struct B { T &foo (); - B () { foo.~T (); } // { dg-error "invalid use of member" } + B () { foo.~T (); } // { dg-error "10:invalid use of member" } }; B<int> b; @@ -19,7 +19,7 @@ B<int> b; template <typename T, typename S> struct C { T t; - C () { t.~S (); } // { dg-error "is not of type" } + C () { t.~S (); } // { dg-error "10:is not of type" } }; C<int, long int> c; @@ -28,7 +28,7 @@ template <typename T> 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<int> d; @@ -37,7 +37,7 @@ template <typename T> 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<int> e; |