aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2013-09-12 13:49:18 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2013-09-12 13:49:18 +0000
commit2dc6ed8700c2928d30be6d5d035095b4977e7dad (patch)
treeaed3e28195574fbdb243323a9226ea49737a80da /gcc
parentb12ebd96ba91490e361a139dca9d0fc17a67312f (diff)
downloadgcc-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/ChangeLog11
-rw-r--r--gcc/cp/parser.c8
-rw-r--r--gcc/cp/pt.c13
-rw-r--r--gcc/cp/semantics.c15
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/template/pseudodtor2.C2
-rw-r--r--gcc/testsuite/g++.dg/template/pseudodtor3.C10
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;