]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
semantics.c (finish_pseudo_destructor_expr): Add location_t parameter.
authorPaolo Carlini <paolo.carlini@oracle.com>
Thu, 12 Sep 2013 13:49:18 +0000 (13:49 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 12 Sep 2013 13:49:18 +0000 (13:49 +0000)
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

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/cp/pt.c
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/pseudodtor2.C
gcc/testsuite/g++.dg/template/pseudodtor3.C

index 6d32109fff51ab762f75a3e6f45ff9dfe40cf6d4..a0935dc404fcbc03cdcb3d76a9d99eec7a2a944f 100644 (file)
@@ -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>
 
index 923277b6daa7cb46f8403c22998ffa5ea132ca1e..e00e56c6e012a7cf0f9f8e6206f65ab47e56d0ad 100644 (file)
@@ -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);
        }
     }
 
index e937318d22756008a585b37e64382c3d385be62e..e4ae4b763059139f38a390ceec525a1527d9510a 100644 (file)
@@ -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));
                  }
              }
          }
index ee3503cdd772f9a9d6a5dc808cfb779875334d2a..6d7f55f73198b9db40a28166aefe0be37f0fbbf2 100644 (file)
@@ -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.  */
index 75110d9021d388276d6d64ba8d854df8c1cb0ee5..579c6b88515df3e52359b9a85fe1267d83a58322 100644 (file)
@@ -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
index 796aff0785b8ca401d5ac128fd7cb6edb79d87fe..d4a9ac1cbc803510a1c2ca6bce15213c382dc380 100644 (file)
@@ -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
index 5f392f4e492e26907b3d9b04c9f487886ce1d33f..202182f533707ab7577f652efe9d9ba66b859e71 100644 (file)
@@ -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;