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
This commit is contained in:
parent
b12ebd96ba
commit
2dc6ed8700
7 changed files with 44 additions and 21 deletions
|
@ -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>
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
13
gcc/cp/pt.c
13
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue