Commit 2dc6ed87 by Paolo Carlini Committed by Paolo Carlini

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
parent b12ebd96
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> 2013-09-10 Jan Hubicka <jh@suse.cz>
Paolo Carlini <paolo.carlini@oracle.com> Paolo Carlini <paolo.carlini@oracle.com>
......
...@@ -5533,6 +5533,7 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, ...@@ -5533,6 +5533,7 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
cp_id_kind * pidk_return) cp_id_kind * pidk_return)
{ {
cp_token *token; cp_token *token;
location_t loc;
enum rid keyword; enum rid keyword;
cp_id_kind idk = CP_ID_KIND_NONE; cp_id_kind idk = CP_ID_KIND_NONE;
tree postfix_expression = NULL_TREE; tree postfix_expression = NULL_TREE;
...@@ -5540,6 +5541,7 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, ...@@ -5540,6 +5541,7 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
/* Peek at the next token. */ /* Peek at the next token. */
token = cp_lexer_peek_token (parser->lexer); token = cp_lexer_peek_token (parser->lexer);
loc = token->location;
/* Some of the productions are determined by keywords. */ /* Some of the productions are determined by keywords. */
keyword = token->keyword; keyword = token->keyword;
switch (keyword) switch (keyword)
...@@ -5685,7 +5687,6 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, ...@@ -5685,7 +5687,6 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
vec<tree, va_gc> *vec; vec<tree, va_gc> *vec;
unsigned int i; unsigned int i;
tree p; tree p;
location_t loc = token->location;
cp_lexer_consume_token (parser->lexer); cp_lexer_consume_token (parser->lexer);
vec = cp_parser_parenthesized_expression_list (parser, non_attr, 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, ...@@ -6018,8 +6019,7 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
postfix_expression postfix_expression
= cp_parser_postfix_dot_deref_expression (parser, token->type, = cp_parser_postfix_dot_deref_expression (parser, token->type,
postfix_expression, postfix_expression,
false, &idk, false, &idk, loc);
token->location);
is_member_access = true; is_member_access = true;
break; break;
...@@ -6338,7 +6338,7 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser, ...@@ -6338,7 +6338,7 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser,
pseudo_destructor_p = true; pseudo_destructor_p = true;
postfix_expression postfix_expression
= finish_pseudo_destructor_expr (postfix_expression, = finish_pseudo_destructor_expr (postfix_expression,
s, type); s, type, location);
} }
} }
......
...@@ -5398,7 +5398,8 @@ unify_arg_conversion (bool explain_p, tree to_type, ...@@ -5398,7 +5398,8 @@ unify_arg_conversion (bool explain_p, tree to_type,
tree from_type, tree arg) tree from_type, tree arg)
{ {
if (explain_p) 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); arg, from_type, to_type);
return 1; return 1;
} }
...@@ -14292,9 +14293,10 @@ tsubst_copy_and_build (tree t, ...@@ -14292,9 +14293,10 @@ tsubst_copy_and_build (tree t,
case PSEUDO_DTOR_EXPR: case PSEUDO_DTOR_EXPR:
RETURN (finish_pseudo_destructor_expr RETURN (finish_pseudo_destructor_expr
(RECUR (TREE_OPERAND (t, 0)), (RECUR (TREE_OPERAND (t, 0)),
RECUR (TREE_OPERAND (t, 1)), RECUR (TREE_OPERAND (t, 1)),
tsubst (TREE_OPERAND (t, 2), args, complain, in_decl))); tsubst (TREE_OPERAND (t, 2), args, complain, in_decl),
input_location));
case TREE_LIST: case TREE_LIST:
{ {
...@@ -14423,7 +14425,8 @@ tsubst_copy_and_build (tree t, ...@@ -14423,7 +14425,8 @@ tsubst_copy_and_build (tree t,
{ {
dtor = TREE_OPERAND (dtor, 0); dtor = TREE_OPERAND (dtor, 0);
if (TYPE_P (dtor)) if (TYPE_P (dtor))
RETURN (finish_pseudo_destructor_expr (object, s, dtor)); RETURN (finish_pseudo_destructor_expr
(object, s, dtor, input_location));
} }
} }
} }
......
...@@ -2361,7 +2361,8 @@ finish_this_expr (void) ...@@ -2361,7 +2361,8 @@ finish_this_expr (void)
was of the form `OBJECT.SCOPE::~DESTRUCTOR'. */ was of the form `OBJECT.SCOPE::~DESTRUCTOR'. */
tree 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) if (object == error_mark_node || destructor == error_mark_node)
return error_mark_node; return error_mark_node;
...@@ -2372,15 +2373,16 @@ finish_pseudo_destructor_expr (tree object, tree scope, tree destructor) ...@@ -2372,15 +2373,16 @@ finish_pseudo_destructor_expr (tree object, tree scope, tree destructor)
{ {
if (scope == error_mark_node) 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; return error_mark_node;
} }
if (is_auto (destructor)) if (is_auto (destructor))
destructor = TREE_TYPE (object); destructor = TREE_TYPE (object);
if (scope && TYPE_P (scope) && !check_dtor_name (scope, destructor)) if (scope && TYPE_P (scope) && !check_dtor_name (scope, destructor))
{ {
error ("qualified type %qT does not match destructor name ~%qT", error_at (loc,
scope, destructor); "qualified type %qT does not match destructor name ~%qT",
scope, destructor);
return error_mark_node; return error_mark_node;
} }
...@@ -2401,12 +2403,13 @@ finish_pseudo_destructor_expr (tree object, tree scope, tree destructor) ...@@ -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), if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (object),
destructor)) 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 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. */ /* Finish an expression of the form CODE EXPR. */
......
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> 2013-09-12 Richard Biener <rguenther@suse.de>
PR tree-optimization/58404 PR tree-optimization/58404
......
...@@ -6,7 +6,7 @@ template<typename S> struct D ...@@ -6,7 +6,7 @@ template<typename S> struct D
typedef int T; typedef int T;
S foo (); S foo ();
D () { foo ().~T(); } // { dg-error "is not of type" } D () { foo ().~T(); } // { dg-error "10:is not of type" }
}; };
struct Z struct Z
......
...@@ -5,13 +5,13 @@ struct A ...@@ -5,13 +5,13 @@ struct A
{ {
typedef int T; typedef int T;
T &foo (); 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 template <typename T> struct B
{ {
T &foo (); T &foo ();
B () { foo.~T (); } // { dg-error "invalid use of member" } B () { foo.~T (); } // { dg-error "10:invalid use of member" }
}; };
B<int> b; B<int> b;
...@@ -19,7 +19,7 @@ B<int> b; ...@@ -19,7 +19,7 @@ B<int> b;
template <typename T, typename S> struct C template <typename T, typename S> struct C
{ {
T t; 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; C<int, long int> c;
...@@ -28,7 +28,7 @@ template <typename T> struct D ...@@ -28,7 +28,7 @@ template <typename T> struct D
{ {
T t; T t;
typedef long int U; 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; D<int> d;
...@@ -37,7 +37,7 @@ template <typename T> struct E ...@@ -37,7 +37,7 @@ template <typename T> struct E
{ {
T &foo (); T &foo ();
typedef long int U; 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; E<int> e;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment